[SQL] 오라클 SQL에 대한 파서
SQL오라클 SQL에 대한 파서
내 현재 프로젝트를 위해 나는 오라클 SQL 문을 구문 분석 SQL 구문 분석기가 필요합니다. 현재 나는 간단한 쿼리를 위해 잘 작동 jsqlparser을 사용하고있다. 특정 기능 (예를 들어, 주조 () 또는 (+))를 발생 때 파서는 실패합니다.
사람이 오라클 SQL을 완벽하게 준수 파서를 제안 할 수 있습니다?
베스트, 의지
해결법
-
==============================
1.당신은 일반 SQL 파서 생각 해 봤나? 나는 어떤 경험 자신을 가지고 있지 않지만 자신의 웹 사이트를 탐색하는 것은 잠재적있다. 개인적으로 나는 내 자신의 이클립스 데이터 도구의 구문 분석기에 내장 굴러 플랫폼 (미안 해요 할 수없는 주, 그것은 소유의), 그러나 지금 나는 그것보다 오라클 SQL의 더 범위를 가지고 주장 때문에 위의 링크를 평가해야합니다 내 파서는 않습니다.
당신은 일반 SQL 파서 생각 해 봤나? 나는 어떤 경험 자신을 가지고 있지 않지만 자신의 웹 사이트를 탐색하는 것은 잠재적있다. 개인적으로 나는 내 자신의 이클립스 데이터 도구의 구문 분석기에 내장 굴러 플랫폼 (미안 해요 할 수없는 주, 그것은 소유의), 그러나 지금 나는 그것보다 오라클 SQL의 더 범위를 가지고 주장 때문에 위의 링크를 평가해야합니다 내 파서는 않습니다.
-
==============================
2.ANTLR은 (V3가, V4) 파서 생성기는 오라클 SQL 및 PL의 번호를했다 / SQL이 작성된 문법; 자세한 내용은 문법 목록 (V3)를 참조하십시오. 저것들의:
ANTLR은 (V3가, V4) 파서 생성기는 오라클 SQL 및 PL의 번호를했다 / SQL이 작성된 문법; 자세한 내용은 문법 목록 (V3)를 참조하십시오. 저것들의:
-
==============================
3.같은 문제를 작업 한 후, 나는 SQL 파서 작업을 얻을 수 있었다 :
같은 문제를 작업 한 후, 나는 SQL 파서 작업을 얻을 수 있었다 :
내 코드는 다음과 같습니다 :
import oracle.jdeveloper.db.DatabaseConnections; import oracle.javatools.db.sql.SQLQueryBuilder; import oracle.javatools.db.Database; ... // load the database connections // this is specific to Oracle SQL developer DatabaseConnections connections = DatabaseConnections.getPrivateInstance( (new File("src/test/resources/connection.xml")).toURI().toURL(), "somePassword"); // get the one we are interested in Database database = connections.getDatabase("the-name-of-a-sqldeveloper-connection"); SQLQueryBuilder queryBuilder = SQLQueryBuilderFactory.createBuilder( database, new Schema("OPTIONAL_SCHEMA"), "select * from some_table");
이 작업을 얻을 수있는 문제는 다음과 같습니다
<?xml version = '1.0' encoding = 'UTF-8'?> <References xmlns="http://xmlns.oracle.com/adf/jndi"> <Reference name="the-name-of-a-sqldeveloper-connection" className="oracle.jdeveloper.db.adapter.DatabaseProvider" xmlns=""> <Factory className="oracle.jdevimpl.db.adapter.DatabaseProviderFactory1212"/> <RefAddresses> <StringRefAddr addrType="password"> <Contents>HSx10FtlsPc=</Contents> </StringRefAddr> <StringRefAddr addrType="oraDriverType"> <Contents>thin</Contents> </StringRefAddr> ...
이러한 파일을 얻으려면 오라클 SQL 개발자 설정이 저장되고 그냥 자신의 파일에 그 내용을 복사 - 붙여 넣기하는 폴더에 파고해야합니다.
지금, 당신은 내가 최종 솔루션에 실망있어 문제와 포인트는 지금까지 여기를 얻을 관리 가정하면
나는이 대답을 게시하는 이유는 (나는 확실히 그런 것 행복하게 지불 거기 사용자가하고 오라클 SQL 파서를 가진 것이 완벽하게 가능하다는 사실에 지역 사회의 관심을 유도하고, 언젠가 오라클은 경쟁 우위로 파서를 노출 고려할 것입니다 일부 수수료) 라이센스를 얻을 수 있습니다.
-
==============================
4.왜 오라클 파서를 사용하지 않을까요?
왜 오라클 파서를 사용하지 않을까요?
create global temporary table plans as select * from table(dbms_xplan.display_cursor()); --/ declare c number; i varchar2(30); l number; stmt varchar2(4000); begin delete from plans; stmt:= 'select z.* from z,skew1 where z.z = skew1.fillblocks'; l:= length(stmt); c:=dbms_sql.open_cursor(); dbms_sql.parse (c, stmt,dbms_sql.native); select distinct sql_id into i from v$open_cursor where sid in (select sid from v$mystat) and substr(sql_text,1,l) = substr(stmt,1,l); insert into plans select * from table(dbms_xplan.display_cursor(i)); dbms_output.put_Line ('sql_id:'||i); end; / select * from plans; PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------- SQL_ID 97qc3ynmw1pa4, child number 0 ------------------------------------- select z.* from z,skew1 where z.z = skew1.fillblocks Plan hash value: 942457544 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 85 (100)| | |* 1 | HASH JOIN | | 1 | 410 | 85 (2)| 00:00:02 | | 2 | TABLE ACCESS FULL| Z | 1 | 9 | 2 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| SKEW1 | 6000 | 2349K| 82 (0)| 00:00:01 | ---------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("Z"."Z"=INTERNAL_FUNCTION("SKEW1"."FILLBLOCKS"))
당신은 오라클 데이터베이스 연결을 필요합니까. 출력은 당신이 원하는 경우,이 바퀴에 대한 다른 색상을 재-발명하지 않고, 당신이 원하는 것을 얻을 수있는 가장 쉬운 방법입니다. 이 예에서 나는 4000 자에 SQL을 제한하지만 당신은 그래서 당신이 상상할 수없는 크기의 SQL의 구문을 분석 할 수 있도록하고, dbms_sql.parse 기능으로 VARCHAR2의 PL / SQL 배열을 공급할 수 있습니다.
-
==============================
5.두 개의 서로 다른 SQL 파서를했을 때 오라클은 동기화의 SQL 및 PL / SQL VM의에 대한 SQL 파서를 유지할 수 없다는 것을 감안할 때, 그것은 제삼자는 "완벽하게 호환"파서를 만들 수있을 것 같지는이다.
두 개의 서로 다른 SQL 파서를했을 때 오라클은 동기화의 SQL 및 PL / SQL VM의에 대한 SQL 파서를 유지할 수 없다는 것을 감안할 때, 그것은 제삼자는 "완벽하게 호환"파서를 만들 수있을 것 같지는이다.
어떤 데이터는 쿼리에서 추출하려고? Oracle 데이터베이스 자체는 먼저 쿼리를 구문 분석하지 않고 그 정보를 추출 할 수 있도록하는 다른 기능을 가질 수있다.
-
==============================
6.우리 DMS 소프트웨어 재 설계 툴킷은 오라클 PLSQL 파서, 또는 SQL 2011 파서를 얻을 수있다. DMS는 파서를 제공하는 AST를 구축, 당신은 / 조사 임의로 트리를 변환하고 해당 작업을 수행하려는 경우 소스 코드와 AST를 다시 생성 할 수 있습니다.
우리 DMS 소프트웨어 재 설계 툴킷은 오라클 PLSQL 파서, 또는 SQL 2011 파서를 얻을 수있다. DMS는 파서를 제공하는 AST를 구축, 당신은 / 조사 임의로 트리를 변환하고 해당 작업을 수행하려는 경우 소스 코드와 AST를 다시 생성 할 수 있습니다.
당신은 웹 사이트에서 사용할 수 포맷터 PLSQL을 다운로드하여 파서을 테스트 할 수 있습니다; 사용하는 것과 같은 기본 DMS 기계가; 단지 / 분석 트리를 변환하지 않습니다.
당신은 간단한 PLSQL 프로 시저에서 SQL 문을 포장해야 할 수도 있습니다.
-
==============================
7.http://www.ibrezina.net/OracleSQL.tgz을이보십시오. 그것은 오라클의 PL / SQL에 대한 ANTLR3.3 문법입니다. 문법은 C 목표를위한 것입니다하지만 쉽게 자바 나 C #으로 변환 할 수 있습니다. 당신의 작업은 쿼리에 포함 된 테이블의 목록은 이미 예제로 포함되어 있습니다.
http://www.ibrezina.net/OracleSQL.tgz을이보십시오. 그것은 오라클의 PL / SQL에 대한 ANTLR3.3 문법입니다. 문법은 C 목표를위한 것입니다하지만 쉽게 자바 나 C #으로 변환 할 수 있습니다. 당신의 작업은 쿼리에 포함 된 테이블의 목록은 이미 예제로 포함되어 있습니다.
from https://stackoverflow.com/questions/5735791/parser-for-oracle-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PHP에서 "관련 항목"을 찾는 방법 (0) | 2020.06.28 |
---|---|
[SQL] SQL 쿼리 내에서 단일 인용 탈출 (0) | 2020.06.27 |
[SQL] 바이트 배열에서 파일 확장자를 추출하는 방법 (0) | 2020.06.27 |
[SQL] SQL 벌크 기록 업데이트 (0) | 2020.06.27 |
[SQL] SQL LIKE %의 내부 어레이 (0) | 2020.06.27 |