복붙노트

[SQL] 오라클 SQL에 대한 파서

SQL

오라클 SQL에 대한 파서

내 현재 프로젝트를 위해 나는 오라클 SQL 문을 구문 분석 SQL 구문 분석기가 필요합니다. 현재 나는 간단한 쿼리를 위해 잘 작동 jsqlparser을 사용하고있다. 특정 기능 (예를 들어, 주조 () 또는 (+))를 발생 때 파서는 실패합니다.

사람이 오라클 SQL을 완벽하게 준수 파서를 제안 할 수 있습니다?

베스트, 의지

해결법

  1. ==============================

    1.당신은 일반 SQL 파서 생각 해 봤나? 나는 어떤 경험 자신을 가지고 있지 않지만 자신의 웹 사이트를 탐색하는 것은 잠재적있다. 개인적으로 나는 내 자신의 이클립스 데이터 도구의 구문 분석기에 내장 굴러 플랫폼 (미안 해요 할 수없는 주, 그것은 소유의), 그러나 지금 나는 그것보다 오라클 SQL의 더 범위를 가지고 주장 때문에 위의 링크를 평가해야합니다 내 파서는 않습니다.

    당신은 일반 SQL 파서 생각 해 봤나? 나는 어떤 경험 자신을 가지고 있지 않지만 자신의 웹 사이트를 탐색하는 것은 잠재적있다. 개인적으로 나는 내 자신의 이클립스 데이터 도구의 구문 분석기에 내장 굴러 플랫폼 (미안 해요 할 수없는 주, 그것은 소유의), 그러나 지금 나는 그것보다 오라클 SQL의 더 범위를 가지고 주장 때문에 위의 링크를 평가해야합니다 내 파서는 않습니다.

  2. ==============================

    2.ANTLR은 (V3가, V4) 파서 생성기는 오라클 SQL 및 PL의 번호를했다 / SQL이 작성된 문법; 자세한 내용은 문법 목록 (V3)를 참조하십시오. 저것들의:

    ANTLR은 (V3가, V4) 파서 생성기는 오라클 SQL 및 PL의 번호를했다 / SQL이 작성된 문법; 자세한 내용은 문법 목록 (V3)를 참조하십시오. 저것들의:

  3. ==============================

    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. ==============================

    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. ==============================

    5.두 개의 서로 다른 SQL 파서를했을 때 오라클은 동기화의 SQL 및 PL / SQL VM의에 대한 SQL 파서를 유지할 수 없다는 것을 감안할 때, 그것은 제삼자는 "완벽하게 호환"파서를 만들 수있을 것 같지는이다.

    두 개의 서로 다른 SQL 파서를했을 때 오라클은 동기화의 SQL 및 PL / SQL VM의에 대한 SQL 파서를 유지할 수 없다는 것을 감안할 때, 그것은 제삼자는 "완벽하게 호환"파서를 만들 수있을 것 같지는이다.

    어떤 데이터는 쿼리에서 추출하려고? Oracle 데이터베이스 자체는 먼저 쿼리를 구문 분석하지 않고 그 정보를 추출 할 수 있도록하는 다른 기능을 가질 수있다.

  6. ==============================

    6.우리 DMS 소프트웨어 재 설계 툴킷은 오라클 PLSQL 파서, 또는 SQL 2011 파서를 얻을 수있다. DMS는 파서를 제공하는 AST를 구축, 당신은 / 조사 임의로 트리를 변환하고 해당 작업을 수행하려는 경우 소스 코드와 AST를 다시 생성 할 수 있습니다.

    우리 DMS 소프트웨어 재 설계 툴킷은 오라클 PLSQL 파서, 또는 SQL 2011 파서를 얻을 수있다. DMS는 파서를 제공하는 AST를 구축, 당신은 / 조사 임의로 트리를 변환하고 해당 작업을 수행하려는 경우 소스 코드와 AST를 다시 생성 할 수 있습니다.

    당신은 웹 사이트에서 사용할 수 포맷터 PLSQL을 다운로드하여 파서을 테스트 할 수 있습니다; 사용하는 것과 같은 기본 DMS 기계가; 단지 / 분석 트리를 변환하지 않습니다.

    당신은 간단한 PLSQL 프로 시저에서 SQL 문을 포장해야 할 수도 있습니다.

  7. ==============================

    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 #으로 변환 할 수 있습니다. 당신의 작업은 쿼리에 포함 된 테이블의 목록은 이미 예제로 포함되어 있습니다.

  8. from https://stackoverflow.com/questions/5735791/parser-for-oracle-sql by cc-by-sa and MIT license