다양한 수의 바인딩으로 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 IMMEDIATE
PLSQL 코드 블록을 사용하면 위치가 아닌 이름으로 변수를 바인딩할 수 있습니다.
예제/코드와 유사한 질문/답변 스레드를 확인하십시오.
사할수있을 사용할 수 .dbms_sql
Steve 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
'programing' 카테고리의 다른 글
Oracle에서 고유 제약 조건 수정 (0) | 2023.08.04 |
---|---|
클래스 변수가 아직 지원되지 않음 (0) | 2023.08.04 |
Twitter Bootstrap 3에서 버튼을 중앙에 배치하는 방법은? (0) | 2023.08.04 |
"AJAX"를 사용하여 CSV 파일 다운로드 (0) | 2023.08.04 |
Objective-C 코드가 Swift 클래스 확장을 호출할 수 있습니까? (0) | 2023.08.04 |