2010-06-25 2 views
0

오라클과 함께 사용되는 다소 큰 SQL 스크립트로 작업하고 있지만 문제가 있습니다. 먼저, 스크립트가 어떻게 작동 하는지를 설명하겠습니다. `PL/SQL의 변수

  • `SERVERID 번호;

    1. 변수를
      • `CUSTOMERID 번호 선언은 고객으로부터 CUSTOMERID INTO
      • `SELECT ID가 존재하지 않을 경우`
    2. 는 고객을 만들기를 WHERE NAME = ' 방금 삽입 한 고객 '
    3. 서버가 존재하지 않으면 서버를 생성하고 서버를 고객과 관련시키기 위해'CUSTOMERID '값을 사용하십시오.
    4. `SERVERID IN THE SERVERID WHERE HOSTNAME = 'the.server.i.just.created'; '
    5. 이 서버에 속한 각 서비스에 대해'SERVERID '값을 사용하여 서비스를 삽입하여 서비스를 섬기는 사람. 2

    -

  • 이동 지금이 과정은 15 개 서버, 각각은 6 개 서비스를 하나 개의 고객을 위해 잘 작동하는 것 같다. 그러나 다음 고객이 소개 되 자마자 변수 대체에 대한 프롬프트가 나타납니다.

    INSERT INTO SERVERS(CUSTOMER_ID, HOSTNAME) 
    SELECT CUSTOMERID, 'the.server.i.just.created' FROM DUAL 
    WHERE NOT EXISTS (
        SELECT * 
        FROM SERVERS 
        WHERE HOSTNAME = 'the.server.i.just.created' 
    ); 
    

    가 나는 또한 DECLARE ... BEGIN ... END; 방법을 사용하여 시도했다, 그러나 나는 같은 일반적인 결과를받을 : 내 삽입에 변수를 사용하고 방법은 매우 간단합니다. 필자가 보았던 몇 가지 예는 :CUSTOMERID 스타일 변수를 사용하는 것이 좋지만, 이전 쿼리를 사용하면 안되는 null 값으로 끝나는 곳에서는 전혀 작동하지 않는 것 같습니다.

    내가 도움이 필요한 것은 이것을 달성하는 방법을 이해하는 것입니다. 프로덕션 환경에 대한 액세스가 매우 제한되어 있으므로 기본 기능 (예 : 새로운 기능, 유형 또는 절차 없음)을 유지해야합니다.

  • 답변

    3

    실제로 책상 위에 머리를 두들 겼을 때 나는 실제로 답을 찾았습니다.

    기본적으로 고객 이름 중 일부에 앰퍼샌드가 포함되어 있었고 앰퍼샌드 바로 뒤에있는 단어가 변수로 바인딩하려고 시도했습니다. 해결책은 SET DEFINE OFF;이었고 모두 잘 수행되었습니다.

    시간 내 주셔서 감사합니다.

    1

    RETURNING clause을 사용하여 다시 쿼리하는 것을 피할 수 있습니다. 예를 들면 :

    이 스크립트에서 호출 독립 일련의 명령문에서보다 PL/SQL에서 깨끗하고 제어하는 ​​경향이
    SQL> var v number 
    SQL> print v 
    v 
    --------- 
    
    
    SQL> insert into demo1 (col1) values (12345) returning col1 into :v; 
    
    1 row inserted 
    
    SQL> print v 
    v 
    --------- 
    12345 
    

    .