2012-10-19 7 views
0

변수에 사용자 입력을 가져 와서 커서에 사용하고 싶습니다. 이 사용자 입력은 사용할 데이터베이스를 표시합니다.스키마 이름을 사용자 입력으로 가져 와서 커서에서 사용하십시오.

--source source 
source varchar2(100) := &SOURCE_ATS_USER_SCHEMA; 
CURSOR cur_list is 
    select ID from source.WEB_FE; 

나는 DECLARE 블록과 함께 위의 코드를 사용합니다. 이것이 실행되면 프롬프트가 사용자 입력을 요구합니다. "ONE"으로 입력한다고 가정하면 "식별자 하나를 선언해야합니다"라는 오류가 발생하고 ONE.WEB_FE 테이블이 존재하지만 "테이블 또는 뷰가 존재하지 않습니다."라는 오류 메시지가 표시됩니다.

스키마 이름을 사용자 입력으로 가져 와서 커서에서 사용하는 방법은 무엇입니까?

고맙습니다

답변

0

합니다. identifier ONE must be declared 메시지는 사용자가 대체 변수를 인용하지 않았기 때문에 나타납니다.

Enter value for source_ats_user_schema: ONE 
old 2: source varchar2(100) := &SOURCE_ATS_USER_SCHEMA; 
new 2: source varchar2(100) := ONE; 
source varchar2(100) := ONE; 
         * 
ERROR at line 2: 
ORA-06550: line 2, column 25: 
PLS-00201: identifier 'SCOTT' must be declared 
ORA-06550: line 2, column 8: 
PL/SQL: Item ignored 

* 'D 위치가 무엇 ONE 방법을 알고하지 않는 것을 보여줍니다 당신이 set verify on이 있다면 당신은 같은 것을 볼 수 있습니다. 당신이 여기에 문자열로 취급하려는 때문에, 당신은해야 할 것 :

source varchar2(100) := '&SOURCE_ATS_USER_SCHEMA'; 

... 보여줄 것이다 :

Enter value for source_ats_user_schema: ONE 
old 2: source varchar2(100) := '&SOURCE_ATS_USER_SCHEMA'; 
new 2: source varchar2(100) := 'ONE'; 

을 ... 유효한. 그것이가는 한. 오류가 source.WEB_FE 참조되는

select ID from source.WEB_FE; 
          * 
ERROR at line 4: 
ORA-06550: line 4, column 27: 
PL/SQL: ORA-00942: table or view does not exist 
ORA-06550: line 4, column 5: 
PL/SQL: SQL Statement ignored 

공지 사항, 하지ONE.WEB_FE : 당신은 여전히 ​​두 번째 오류가 있기 때문에이 실제로 도움이되지 않습니다. source은 대체되지 않습니다. 일반적으로 니콜라스 크라스 노프 (NicholasKrasnov)가 제시 한 방법 중 하나를 사용하여 대답해야하지만 필요 이상으로 복잡해집니다. 난 그냥 말에 반대가, 여기가 대체 변수를 인용 할 필요가 없습니다

CURSOR cur_list is 
    select ID from &SOURCE_ATS_USER_SCHEMA..WEB_FE; 

참고,하지만 당신은 수행이 특정한 경우에 당신이 전혀 source를 선언 할 필요가 없습니다, 당신은 다만 수 명시 적으로 .으로 종료해야 테이블 이름 앞에있는 실제 .을 종결 자로 취급하지 않아야합니다. (추가로 .없이 시도해보십시오. 그렇지 않은 경우 어떻게되는지보십시오).

당신이 그것을 실행하면이 메시지가 나타납니다와 같이 확인 출력이 보일 것이다 :

Enter value for source_ats_user_schema: ONE 
old 3:  select ID from &SOURCE_ATS_USER_SCHEMA..WEB_FE; 
new 3:  select ID from ONE.WEB_FE; 

당신이 볼 수 있듯이, 그것은 이제 지정된 스키마에서 테이블을 찾고있다. 이것은 여전히 ​​동적이지만 특별한 SQL * Plus 방식입니다.

그러나 이러한 방법 중 하나를 사용하면 SQL 주입 가능성을 고려해야합니다.

+0

감사합니다. 원본 varchar2 (100) : = '& SOURCE_ATS_USER_SCHEMA'; 트릭을 했어. – saji159

1

당신이 소유하지 않은 테이블을 조회 할 수 select on 권한이 가정. 쿼리의 from 절에서 스키마 한정자를 변경하려면 동적 SQL을 사용해야합니다. 예를 들어 :

[email protected]> edit 
Wrote file afiedt.buf 

    1 declare 
    2 c sys_refcursor; 
    3 l_emp_name varchar2(11); 
    4 begin 
    5 open c for 'select first_name from ' || '&schema_name' || '.employees where rownum <= 10'; 
    6 loop 
    7  fetch c into l_emp_name; 
    8  exit when c%notfound; 
    9  dbms_output.put_line(l_emp_name); 
10 end loop; 
11 close c; 
12* end; 
[email protected]>/
Enter value for schema_name: hr 
old 5: open c for 'select first_name from ' || '&schema_name' || '.employees where rownum <= 10'; 
new 5: open c for 'select first_name from ' || 'hr' || '.employees where rownum <= 10'; 

Ellen 
Sundar 
Mozhe 
David 
Hermann 
Shelli 
Amit 
Elizabeth 
Sarah 
David 

PL/SQL procedure successfully completed. 

[email protected]> 

또한 당신은 당신이 스키마 이름을 지정하여 쿼리하는 테이블을 한정하지 않아도이 경우

alter session set current_schema = <<schema_name>>; 

주를 발행하여 정적 SQL 및 변경 스키마를 계속 사용할 수 있습니다. 예를 들어. employee 표에서는 스키마 HRNK에 존재하지만 다른 데이터가 들어 : 당신은 여기에 두 가지 문제가

[email protected]> select user from dual; 

USER 
------------------------------ 
HR 

[email protected]> declare 
    2 cursor c is 
    3  select first_name 
    4  from employees 
    5  where rownum <= 7; 
    6 l_emp_name varchar2(11); 
    7 begin 
    8  open c; 
    9  loop 
10  fetch c into l_emp_name; 
11  exit when c%notfound; 
12  dbms_output.put_line(l_emp_name); 
13  end loop; 
14  close c; 
15 end; 
16/

Ellen 
Sundar 
Mozhe 
David 
Hermann 
Shelli 
Amit 

PL/SQL procedure successfully completed. 

[email protected]> alter session set current_schema=NK; 

Session altered. 

[email protected]> declare 
    2 cursor c is 
    3  select first_name 
    4  from employees 
    5  where rownum <= 7; 
    6 l_emp_name varchar2(11); 
    7 begin 
    8  open c; 
    9  loop 
10  fetch c into l_emp_name; 
11  exit when c%notfound; 
12  dbms_output.put_line(l_emp_name); 
13  end loop; 
14  close c; 
15 end; 
16/

Tom 

PL/SQL procedure successfully completed. 

[email protected]> alter session set current_schema=HR; 

Session altered. 

[email protected]> 
+0

지원해 주셔서 감사합니다. 그러나 다른 스키마에서 네 개의 테이블을 참조해야했으며 사용자에게 네 번 입력하라는 메시지를 표시 할 수 없었습니다. Alex Poole이 언급했듯이, source varchar2 (100) : = '& SOURCE_ATS_USER_SCHEMA'; 나를 위해 일했다. – saji159

관련 문제