2017-04-05 1 views
0

SQL 서버에서 나는 항상 일련의 진단 스크립트를 가지고 있었고 항상 다른 변수를 사용하여 변수를 사용하여 다른 선택 및 업데이트가이를 활용할 수 있도록했습니다. Oracle에서이 패턴을 채택하는 데 문제가 있습니다.adhoc 스크립트 매개 변수화

4 개 또는 5 개의 선택 검색어가있을 수 있으며 결과를 확인하면 주석을 제거 할 수있는 업데이트가있을 수 있습니다. 출력에서 select 쿼리의 결과를보고 싶습니다.

SQL Developer를 사용하고 있습니다.

먼저 블록 DEFINE을 사용해 보았습니다.하지만이 블록은 BEGIN/END 블록과 쌍을 이뤄야하며, 일단 쿼리가 블록 안에 있으면 결과를 보는 것이 번거로워 보입니다. 필자가 보았던 예제는 커서를 설정 한 다음 커서를 반복하여 결과를 인쇄하거나 개별 값을 인쇄해야합니다.이 값은 더욱 귀찮습니다.

그래서 대신 내가/선언없이 참조/종료를 시작할 수 있기 때문에 변수를 사용하여 시도,하지만 난 변수의 값을 설정하는 데 문제가 있어요 :

variable customerid number; 
customerid := 1234; 

을하지만이 오류 얻을 :

Error starting at line : 5 in command - customerid := 1234 Error report - Unknown Command

는 또한

select t.customerid into :customerid 
from customer t 
where t.customerid = 1234 

을 시도하고 얻을 :

SQL Error: ORA-01006: bind variable does not exist 01006. 00000 - "bind variable does not exist"

내 목표는 내가 값을 설정 상단에 내 ID 선언을하고, 스크립트를 실행 할 수 있어야하고, 내 모든 애드혹 출력에 표시를 선택하는 것입니다. 좀 더 명시 적으로

variable customerid number; 
exec :customerid := 1234; 

나 :

답변

2

당신은 하나와 함께 execute syntactic wrapper하는 PL/SQL 컨텍스트에서 바인드 변수를 설정해야

(거의) 동일합니다
variable customerid number; 
begin 
    :customerid := 1234; 
end; 
/

, 여러 변수를 설정하려는 경우 더 편리 할 것입니다. 당신이 시도로 당신은 너무 쿼리에서 바인드 variabke를 채울 수 있지만 또한 PL/SQL 컨텍스트에 있어야합니다 : 모두, 그것은 바인드 변수 나타내는

begin 
    select t.customerid into :customerid 
    from customer t 
    where t.customerid = 1234; 
end; 
/

공지 사항 콜론 customerid 전 그것들의. 나중에 참조 할 때 필요합니다. (A PL/SQL 블록에있을 필요가 없습니다) SQL 쿼리에 :

select * from customer where customerid = :customerid; 

당신은 나중에 업데이트에서 동일한 메커니즘을 사용할 수 있습니다. 콜론을 사용하는 경우의 예외는 변수의 값을보고 싶다는 것입니다. 당신은 select :customerid from dual 수 있지만 변수가 refcursor 경우 더욱 유용 there is also the ability to

print customerid 

.


definesubstitution variables보다는 바인드 변수 완전히 다른기구이다. 다음과 같이 PL/SQL 블록을 사용할 필요가 없습니다.

define customerid=1234 
select * from customer where customerid = &customerid; 

이번에는 콜론이 없습니다. 그리고 또한 변수가 문자열 인 경우 당신이 그것을 사용할 때, 따옴표로 묶어야 할 필요가 있습니다 :

define name=aaron 
select * from users where first_name = '&name'; 

당신은 또한 the new_value syntax를 사용하여 대체 변수를 채우는 데 쿼리의 결과를 사용할 수 있습니다.

+0

구문과 용어를 지워 주신 Alex에게 감사드립니다. 'end; 다음에 나오는'/'는 그 뒤에 다른 선택과 함께 시작/끝 블록을 따라갈 수 있다는 점에서 큰 차이가있었습니다. 그게 뭐야? – AaronLS

+0

@AaronLS - [슬래시] (https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve004.htm) * 8-) [this] (https://docs.oracle)도 참조하십시오. .com/cd/E11882_01/server.112/e16604/ch_four.htm # sthref273) 및 [this] (https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_four.htm#i1039663) . (그것들은 모두 SQL \ * Plus 문서에 대한 링크이지만, 디자인 상으로 대부분은 SQL Developer에 적용됩니다. 일반적으로 덜 잘 문서화되어 있습니다 ...) –