programing

실제 쿼리를 실행하지 않고 JDBC 문에 대한 SQL 구문을 확인하려면 어떻게 해야 합니까?

bestprogram 2023. 7. 21. 21:46

실제 쿼리를 실행하지 않고 JDBC 문에 대한 SQL 구문을 확인하려면 어떻게 해야 합니까?

유효한 경우 실행 시간이 오래 걸리는 SQL 문(Oracle 데이터베이스의 경우)이 있습니다.유효하지 않으면 오류와 함께 즉시 반환됩니다.

예를 들어 '문 확인' 버튼 뒤에서 문을 실행하지 않고(JDBC를 통해) 구문이 유효한지 확인하고 싶습니다.벤더에 의존하지 않는 방법이 있습니까?단순히 쿼리를 준비된 문장으로 정의하는 것에 대한 저의 첫 번째 생각은 어떤 종류의 컴파일이나 오류 검사도 유발하지 않는 것 같습니다.

아마도 그 진술에 대한 설명 계획을 발표하는 것은 당신에게 유용한 결과를 줄 것입니다.

다른 생각 - 하지만 쿼리를 편집하여 추가하거나 빠르게 실행되도록 하는 것이 더 어려울 수 있습니다.

SELECT 쿼리를 처리하는 경우 JDBC PreparedStatement #getMetaData가 작동합니까?

이는 실제 답변이라기보다는 해킹에 가깝지만 항상 하나의 행과 하나의 열을 반환하는 쿼리를 실행할 수 있습니다.

SELECT ( EXISTS (SELECT 1 FROM dual)
         OR
         EXISTS (your Query here)
       ) AS result
FROM dual 

반환해야 합니다.TRUE쿼리가 유효한 경우 오류를 발생시킵니다.

사용할 수 있습니다.DBMS_SQL.PARSE당신의 진술을 확인하기 위해.경고:DML 문만 구문 분석하지만 테이블 만들기 등의 DDL 문을 실행하고 커밋합니다.저장 프로시저를 생성하여 값 또는 부울을 반환하고 다음과 같이 블록을 래핑할 수 있습니다.

set serveroutput on
-- Example of good SQL 
declare
  c integer;
  s varchar2(50) := 'select * from dual';
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,s,1);
  dbms_sql.close_cursor(c);
  dbms_output.put_line('SQL Ok');
exception
  when others then
    dbms_sql.close_cursor(c);
    dbms_output.put_line('SQL Not Ok');
end;
/

-- Example of bad SQL
declare
  c integer;
  s varchar2(50) := 'select splat from dual';
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,s,1);
  dbms_sql.close_cursor(c);
  dbms_output.put_line('SQL Ok');
exception
  when others then
    dbms_sql.close_cursor(c);
    dbms_output.put_line('SQL Not Ok');
end;
/

Oracle의 Pro*C 사전 컴파일러를 사용하여 구문 검사(여기서 다운로드)를 수행할 수 있습니다.

이것은 원시 Oracle SQL 문을 포함하는 C 코드를 사전 컴파일하기 위한 도구이지만 SQL 구문 검사를 수행하기 위해 "남용"할 수 있습니다.

  1. 다음 코드를 사용하여 test.pc 파일을 만듭니다.

    EXEC SQL SELECT * FROM DUAL WARE 1=1;

  2. 사전 컴파일러 도구를 설치한 후 다음 명령을 실행합니다.

    proCINAME=테스트 SQLCHECK=테스트

  3. 다음과 같은 출력이 표시됩니다.

    줄 1, 열 34, file test.pc의 구문 오류: 줄 1의 오류, 파일 test.pc의 열 34
    EXEC SQL SELECT * FROM DUAL WARE 1=1;
    .................................1
    PCC-S-02201, 다음 중 하나가 예상될 때 기호 "1"이 발생했습니다.
    , for, 결합, 연결, 그룹, 있음, 교차, 빼기, 순서, 시작, 위치, 사용,
    기호 "have"가 "1"로 대체되어 계속 진행되었습니다.

이를 솔루션에 통합하는 것은 간단해야 합니다.

또한 온라인 시맨틱 검사를 수행하여 사용된 모든 프로시저와 테이블이 특정 스키마에서 유효한지 확인할 수 있습니다.이를 위해 SQLCHECK=SQL USERID=user를 전달합니다.

언급URL : https://stackoverflow.com/questions/10247106/how-can-i-check-sql-syntax-for-a-jdbc-statement-without-running-the-actual-query