2009-07-24 6 views
15

스크립트에 사용 된 테이블 이름을 변수로 설정하려는 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; 
+1

FYI : 예제를 기반으로하면 실제로 PL/SQL을 사용하지 않고 있습니다. 나는 당신이 SQLPlus 스크립트를 가지고 있다는 것을 의미한다고 생각한다. 전문적으로, 당신의 exec 명령은 PL/SQL을 호출하지만 여기서 보여주는 것은 전반적으로 SQLPlus 명령입니다. –

+1

글쎄, 기술적으로 그는 둘 다 사용하고있다. 스크립트의 변수 명령은 PL/SQL 바인드 변수를 선언한다. –

답변

6

Substitution variables 일 :

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

D 
- 
X 
+0

하! 위대한 마음은 비슷하게 생각합니다 - 의사 링크조차도 동일합니다. –

+0

사실! 링크는 앵커까지 동일합니다. –

14

당신은 SQLPLUS에서이 스크립트를 (경우로 보이는), 당신은 SQLPLUS의 substition 변수를 만들 수있는 명령을 정의하는 사용하려면 실행하는 경우 단지 바로 문자열 치환, 예를 들면 것을 :

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

이 사용하는 방법에 대한 자세한 내용은 Using Sql*Plus를 참조하십시오. 과 같이 SQLPLUS를 호출 한 후

define tableNm = &1 
select * from &tableNm; 

을 ... 그리고 :

sqlplus user/[email protected] @myscript.sql customers2008 

을 그렇게하지 않으면 당신은 다음과 같이 미리 정의 된 위치 substition 변수를 사용하여 명령 줄에서 스크립트에 값을 전달할 수 있습니다 명령 줄에서 값을 전달하면 스크립트 호출자는 값을 입력하라는 메시지를 표시합니다.

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

+0

SQLPlus 호출 예제가 작동하지 않습니다 (적어도 저에게는). 명령 줄에서 값을 전달하려면 스크립트를 호출해야합니다 (예 : 'sqlplus 사용자/pwd @ 서버 @myscript customers2008'. –

+0

사실! 수정 및 수정 됨. –

+0

좋아요! 좋은 물건 스티브! – CFNinja

8

몇 가지 설명을 추가하려고합니다 :

바인드 변수라고 사용하려고했다 방법을. 바인드 변수는 콜론과 식별자 뒤에 오라클 SQL로 식별됩니다. 바인드 변수의 목적은 SQL 문을 파싱 할 때 값을 알 필요가 없다는 것입니다. 명령문을 한 번 구문 분석 한 다음 변수에 바인드 된 다른 값으로 여러 번 실행할 수 있습니다.

SQL 문을 구문 분석하려면 관련된 테이블과 열 이름을 알아야합니다. 따라서 테이블 이름은 구문 분석시 값을 알 수 없기 때문에 바인드 변수로 표현할 수 없습니다.

SQLPlus를 통해 SQL과 인라인 PL/SQl을 실행하는 경우 대체 변수를 사용하면이 문제를 쉽게 해결할 수 있습니다. 대체 변수는 SQLPlus 클라이언트가 구문 분석을 위해 Oracle에 보내기 전에 명령을 읽을 때 그 값으로 대체됩니다. 오라클은 테이블에 대한 바인드 변수 (또는 다른 개체 이름)을 허용하지 않기 때문에

EXECUTE IMMEDIATE 'select * from' || tableNm; 

이것은 :

7

은 당신이 뭔가를 할해야합니다.

EXECUTE IMMEDIATE 접근 방식에 중요한 보안 영향이 있습니다. tableNm 값을 사용자가 입력하면 SQL injection 개의 공격에 노출됩니다.

관련 문제