문제

모두,

나는 일반적으로 저장된 절차를 처음 접했지만 특히 오라클에있는 사람들과 어려움을 겪고 있습니다. 나는 내가 달성하려는 것에 대한 매우 간단한 예를 만들었 으며이 단순화 된 버전과 동일한 오류를 얻고 있습니다.

저장된 절차는 다음과 같습니다.

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;

위의 저장된 절차를 사용하여 호출 할 때 CALL ashish_test(), 나는 얻다 :

오류 메시지 http://web1.twitpic.com/img/12831839-06a3a36df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

기반 이 기사 (예 : 7-1을보십시오), USING 키워드는 번호가 매겨진 자리 표시자를 교체해야합니다 (:1) 이내에 v_strSQL 저장된 값으로 v_tab. 그러나 계속해서 유효하지 않은 테이블 오류가 발생합니다. 나는 그것이 그 이유라고 생각합니다 EXECUTE IMMEDIATE 어떤 이유로 자리 표시자를 값으로 바꿀 수는 없지만 왜 그런지 잘 모르겠습니다. 내가 여기서 바보 같은 일을하고 있는지 아는 사람이 있습니까?

Oracle 10G 데이터베이스에서 이것을 실행하고 PL/SQL 개발자를 사용하고 있습니다.

도움이 되었습니까?

해결책

사용 절은 테이블 이름이 아닌 바인드 변수 (즉, select 문에서 열 이름을 사용하는 경우)에만 해당됩니다. 일반적인 사용법은 다음과 같습니다.

Select col1 from table1 where col2 = :a

가변 테이블 이름을 사용하려면 다음과 같은 것을 사용하십시오.

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top