programing

다양한 수의 바인딩으로 Oracle EXECUTE Immediate를 실행할 수 있습니까?

closeapi 2023. 8. 4. 23:06
반응형

다양한 수의 바인딩으로 Oracle EXECUTE Immediate를 실행할 수 있습니까?

런타임 전에 SQL에 사용된 바인딩 변수의 정확한 수를 모르는 Oracle에서 동적 SQL 실행을 사용해야 합니다.

호출에 가변 개수의 바인딩 변수를 사용할 수 있는 방법이 있습니까?EXECUTE IMMEDIATE어떻게든?

좀 더 구체적으로, 알 수 없는 SQL에 하나의 파라미터를 전달해야 하는데 거기서 얼마나 자주 사용할지 모르겠습니다.

저는 이런 것을 시도했습니다.

EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;

하지만 그것은 뒤로 내던졌습니다.ORA-01008: not all variables bound.

당신은 이것을 할 수 없습니다.EXECUTE IMMEDIATE그러나 Oracle을 사용하여 이 작업을 수행할 수 있습니다.DBMS_SQL꾸러미Database Application Developer's Guide에는 다음과 같은 항목이 비교되어 있습니다.EXECUTE IMMEDIATE당신은 잘 알고 있고,dbms_sql방법들. 페이지 문서DBMS_SQL그러나 사용자가 시작할 수 있는 몇 가지 예(위 링크)가 있습니다(예: 1은 임의의 수의 바인딩 변수를 가질 수 있는 문을 실행하는 간단한 경우입니다).DBMS_SQL코딩의 관점에서 보면 훨씬 더 번거롭지만, 당신이 상상할 수 있는 모든 것을 할 수 있게 해줄 것입니다.

SQL에서 발생하는 바인딩 변수의 여러 인스턴스가 허용됩니다.그러나 바인딩 변수로 사용 중인 이름(예: 당신의 경우:var)을 알고 있어야 합니다.DBMS_SQL.BIND_VARIABLE.

또한 다음을 사용하여 이 문제를 해결할 수 있습니다.WITH진술.일반적으로 사용하는DBMS_SQL더 낫지만, 때때로 이것은 더 간단한 방법입니다.

BEGIN
    EXECUTE IMMEDIATE 'WITH var AS (SELECT :var FROM dual) SELECT SYSDATE FROM DUAL WHERE (SELECT * FROM var) = (SELECT * FROM var)' USING 1;
END;

질문에 대한 스레드는 이 주제에 대해 자세히 다룹니다.

하나의 매개 변수를 전달하거나 매개 변수를 전달하지 않으려면 단일 매개 변수를 가진 두 개의 쿼리를 작성할 수 있습니다. 이러한 쿼리 중 하나에서는 매개 변수가 사용되지 않습니다(즉, 서술어는 항상 참입니다).

-- query1
SELECT * FROM DUAL WHERE dummy = :x;

-- query2
SELECT * FROM DUAL WHERE nvl(:x, 1) IS NOT NULL;

최적화 도구가 항상 참임을 이해하도록 술어를 세분화할 수 있습니다.

좀 더 구체적으로, 알 수 없는 SQL에 하나의 파라미터를 전달해야 하는데 거기서 얼마나 자주 사용할지 모르겠습니다.

저는 며칠 전에 이 똑같은 문제를 마주쳤는데, 한 친구가 저와 정확히 그것을 할 수 있는 방법을 공유했습니다.EXECUTE IMMEDIATE.

SQL 블록 자체와는 반대로 PLSQL 블록을 생성해야 합니다.사용 시EXECUTE IMMEDIATEPLSQL 코드 블록을 사용하면 위치가 아닌 이름으로 변수를 바인딩할 수 있습니다.

예제/코드와 유사한 질문/답변 스레드를 확인하십시오.

사할수있을 사용할 수 .dbms_sqlSteve Broberg가 설명한 것처럼 그러나 결과 커서는 많은 클라이언트에서 사용(읽기).Oracle 11에는 다음과 dbms_sql.to_refcursor같은 변환 기능()이 추가되었습니다.dbms_sql커서를 참조자로 이동하지만 어떤 이유로 인해 변환된 참조자를 에서 사용할 수 없습니다.넷 애플리케이션.할 수 .net에서는 할 수 .dbms_sql 서커

그러면 어떤 고객이 이 커서를 사용하게 될까요?

언급URL : https://stackoverflow.com/questions/1007912/oracle-execute-immediate-with-variable-number-of-binds-possible

반응형