programing

오라클 스크립트에서 테이블 이름에 변수를 사용하는 방법

muds 2023. 7. 20. 22:11
반응형

오라클 스크립트에서 테이블 이름에 변수를 사용하는 방법

스크립트에 사용되는 테이블 이름을 변수로 설정하려는 pl\sql 스크립트가 있습니다.그래서, 제가 웹에서 찾은 몇몇 예시들로부터, 저는 아래의 코드를 썼습니다.첫 번째 섹션은 작동하므로 일반적인 구문이 올바르다고 생각하지만 두 번째 섹션에서는 테이블 이름에 변수를 사용하려고 하면 오류가 발생합니다("SQL 오류: ORA-00903: 잘못된 테이블 이름").

내가 뭘 잘못했는지 아는 사람...저는 PL\SQL을 많이 하지 않기 때문에 분명하지 않은 부분이 있을 수 있습니다.

--works
variable numOfrecords number;
exec :numOfrecords := 10;
select * from customers2008 where rownum < :numOfrecords;

--does not work
 variable tableNm CHAR;
 exec :tableNm := 'customers2008';
 print tableNm;
 select * from :tableNm;

sqlplus에서 이 스크립트를 실행하는 경우(이 경우처럼 보임) DEFINE 명령을 사용하여 다음과 같은 단순한 문자열 대체인 sqlplus 하위 변수를 만들 수 있습니다.

define tableNm = 'customers2008'
select * from &tableNm;

사용 방법에 대한 자세한 내용은 Sql*Plus 사용을 참조하십시오.다음과 같이 미리 정의된 위치 하위 변수를 사용하여 명령줄에서 스크립트에 값을 전달할 수 있습니다.

define tableNm = &1
select * from &tableNm;

그런 다음 sqlplus를 다음과 같이 호출합니다.

sqlplus user/pwd@server @myscript.sql customers2008

명령줄에서 값을 전달하지 않으면 스크립트 호출기에 값을 입력하라는 메시지가 표시됩니다.

바인딩 변수와 대체 변수의 차이는 아래 Dave Costa의 답변을 참조하십시오.

몇 가지 설명을 추가합니다.

사용하려는 방법을 바인딩 변수라고 합니다.Oracle SQL에서 바인딩 변수는 콜론과 식별자로 식별됩니다.바인딩 변수의 목적은 SQL 문을 구문 분석할 때 값을 알 필요가 없기 때문입니다. 이 문은 한 번 구문 분석한 다음 변수에 바인딩된 다른 값으로 여러 번 실행될 수 있습니다.

SQL 문을 구문 분석하려면 관련된 테이블 및 열 이름을 알아야 합니다.따라서 테이블 이름을 바인딩 변수로 나타낼 수 없습니다. 이 값은 구문 분석 시 알 수 없기 때문입니다.

SQLPlus를 통해 SQL 및 인라인 PL/SQL만 실행하는 경우 대체 변수가 이 문제를 쉽게 처리할 수 있는 방법입니다.대체 변수는 SQL Plus 클라이언트가 명령을 읽을 때 Oracle로 구문 분석을 전송하기도 전에 해당 값으로 대체됩니다.

다음과 같은 작업을 수행해야 합니다.

EXECUTE IMMEDIATE 'select * from ' || tableNm;

이는 Oracle이 테이블(또는 다른 개체 이름)에 대한 바인딩 변수를 허용하지 않기 때문입니다.

EXECUMENT Immediate 접근 방식에는 중요한 보안 영향이 있습니다. tableNm 값이 사용자 제공되면 SQL 주입 공격에 크게 노출됩니다.

대체 변수 작업:

SQL> select * from &table_name;
Enter value for table_name: dual
old   1: select * from &table_name
new   1: select * from dual

D
-
X

SQL Developer를 사용하는 경우:

VARIABLE tableNm CHAR;
VARIABLE cur     REFCURSOR;
EXEC :tableNm := 'customers2008';

DECLARE
  v_sql VARCHAR2(200) := 'SELECT * FROM ' || DBMS_ASSERT.QUALIFIED_SQL_NAME(:tableNm);
BEGIN
  OPEN :cur FOR v_sql;
END;
/

PRINT :cur

언급URL : https://stackoverflow.com/questions/1179652/how-to-use-a-variable-in-oracle-script-for-the-table-name

반응형