문제

런타임 전에 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 's를 사용 하여이 작업을 수행 할 수 있습니다. DBMS_SQL 패키지. 그만큼 데이터베이스 응용 프로그램 개발자 안내서 The를 비교합니다 EXECUTE IMMEDIATE 당신은 친숙하고 dbms_sql 행동 양식. 이 페이지 서류 DBMS_SQL, 그러나 시작해야 할 몇 가지 예 (위의 링크)가 있습니다 (예 1은 임의의 바인드 변수를 가질 수있는 진술을 실행하는 간단한 경우입니다). DBMS_SQL 코딩 관점에서 훨씬 더 번거롭지 만, 당신이 생각할 수있는 모든 것을 할 수 있습니다.

SQL에서 발생하는 BAND 변수의 여러 인스턴스가 허용됩니다. 그러나 이름을 바인드 변수 (예 : 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;

이것 AskTom에 실 주제를 자세히 다룹니다.

귀하의 경우 하나의 매개 변수를 전달하거나 없으면 단일 매개 변수가있는 두 개의 쿼리를 빌드 할 수 있으며 이러한 쿼리 중 하나에서는 다음과 같이 사용되지 않습니다 (예 : 술어는 항상 사실입니다).

-- 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 Cursor to Ref Cursor 그러나 어떤 이유로 든 .NET 응용 프로그램 에서이 변환 된 Ref Cursor를 소비 할 수 없습니다. .NET에서 정상적인 Ref Cursor를 소비 할 수는 있지만 예전의 심판 커서는 없습니다. dbms_sql 커서.

그렇다면 어떤 종류의 고객 이이 커서를 소비 할 것인가?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top