복붙노트

[SQL] 어떻게 변수를 선언하고 동일한 오라클 SQL 스크립트에서 사용하는 방법?

SQL

어떻게 변수를 선언하고 동일한 오라클 SQL 스크립트에서 사용하는 방법?

나는 처음에 약간의 변수를 선언하는 재사용 가능한 코드와 필요성을 쓰고 싶어하고 같은 스크립트에서 재사용 :

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;

어떻게 변수를 선언 등 SQLDeveloper를 사용하여 같이 따라 문에서 다시 사용할 수 있습니다.

시도

그러나 나는 (... 언 바운드 변수, 구문 오류, 예상 SELECT INTO) 내 시도하는 동안 모든 종류의 오류를 얻고있다.

해결법

  1. ==============================

    1.SQL * Plus를 스크립트의 변수를 선언하는 방법은 여러 가지가 있습니다.

    SQL * Plus를 스크립트의 변수를 선언하는 방법은 여러 가지가 있습니다.

    먼저 바인드 변수를 선언하고, VAR을 사용하는 것이다. VAR에 값을 할당하기위한 메커니즘은 EXEC 통화와하다 :

    SQL> var name varchar2(20)
    SQL> exec :name := 'SALES'
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from dept
      2  where dname = :name
      3  /
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            30 SALES          CHICAGO
    
    SQL>
    

    우리는 매개 변수 또는 함수를 OUT이있는 저장 프로 시저를 호출 할 때 VAR 특히 유용합니다.

    또한 우리는 대체 변수를 사용할 수 있습니다. 다음은 대화 형 모드에 좋다 :

    SQL> accept p_dno prompt "Please enter Department number: " default 10
    Please enter Department number: 20
    SQL> select ename, sal
      2  from emp
      3  where deptno = &p_dno
      4  /
    old   3: where deptno = &p_dno
    new   3: where deptno = 20
    
    ENAME             SAL
    ---------- ----------
    CLARKE            800
    ROBERTSON        2975
    RIGBY            3000
    KULASH           1100
    GASPAROTTO       3000
    
    SQL>
    

    우리가 다른 스크립트를 호출하는 스크립트를 작성할 때이 선행 변수를 정의하는 데 유용 할 수 있습니다. 이 조각은 값을 입력하라고 메시지를 표시하지 않고 실행 :

    SQL> def p_dno = 40
    SQL> select ename, sal
      2  from emp
      3  where deptno = &p_dno
      4  /
    old   3: where deptno = &p_dno
    new   3: where deptno = 40
    
    no rows selected
    
    SQL>
    

    마지막으로 익명 PL / SQL 블록이있다. 보시다시피, 우리는 대화 형으로 선언 된 변수에 여전히 할당 값을 할 수 있습니다

    SQL> set serveroutput on size unlimited
    SQL> declare
      2      n pls_integer;
      3      l_sal number := 3500;
      4      l_dno number := &dno;
      5  begin
      6      select count(*)
      7      into n
      8      from emp
      9      where sal > l_sal
     10      and deptno = l_dno;
     11      dbms_output.put_line('top earners = '||to_char(n));
     12  end;
     13  /
    Enter value for dno: 10
    old   4:     l_dno number := &dno;
    new   4:     l_dno number := 10;
    top earners = 1
    
    PL/SQL procedure successfully completed.
    
    SQL>
    
  2. ==============================

    2.그것은 문자 변수의 경우 따옴표를 사용하십시오 :

    그것은 문자 변수의 경우 따옴표를 사용하십시오 :

    DEFINE stupidvar = "'stupidvarcontent'";
    

    또는

    DEFINE stupidvar = 'stupidvarcontent';
    
    SELECT stupiddata  
    FROM stupidtable  
    WHERE stupidcolumn = '&stupidvar'
    

    UPD :

    SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 25 17:13:26 2010
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    SQL> conn od/od@etalon
    Connected.
    SQL> define var = "'FL-208'";
    SQL> select code from product where code = &var;
    old   1: select code from product where code = &var
    new   1: select code from product where code = 'FL-208'
    
    CODE
    ---------------
    FL-208
    
    SQL> define var = 'FL-208';
    SQL> select code from product where code = &var;
    old   1: select code from product where code = &var
    new   1: select code from product where code = FL-208
    select code from product where code = FL-208
                                          *
    ERROR at line 1:
    ORA-06553: PLS-221: 'FL' is not a procedure or is undefined
    
  3. ==============================

    3.에서 PL / SQL 10 절

    에서 PL / SQL 10 절

    키워드 선언은 변수를 선언하는 데 사용됩니다

    DECLARE stupidvar varchar(20);
    

    당신이 선언 할 때 값을 할당하는 당신은 그것을 설정할 수 있습니다

    DECLARE stupidvar varchar(20) := '12345678';
    

    또는 그러나 당신은 또한 당신은 단지 하나의 값이 반환되어 있는지 확인하고, 세미콜론을 잊지 마세요 필요 BEGIN 및 END에 문을 포장 할 필요가, 당신은 INTO 문 사용하는 변수로 뭔가를 선택합니다.

    그래서 전체 문장은 다음 나올 것이다 :

    DECLARE stupidvar varchar(20);
    BEGIN
        SELECT stupid into stupidvar FROM stupiddata CC 
        WHERE stupidid = 2;
    END;
    

    귀하의 변수는 END 자제를 BEGIN 복수해야 할 것 시작 하나보다 더 사용하려는 그렇다면 END 내에서만 사용할 수

    DECLARE stupidvar varchar(20);
    BEGIN
        SELECT stupid into stupidvar FROM stupiddata CC 
        WHERE stupidid = 2;
    
        DECLARE evenmorestupidvar varchar(20);
        BEGIN
            SELECT evenmorestupid into evenmorestupidvar FROM evenmorestupiddata CCC 
            WHERE evenmorestupidid = 42;
    
            INSERT INTO newstupiddata (newstupidcolumn, newevenmorestupidstupidcolumn)
            SELECT stupidvar, evenmorestupidvar 
            FROM dual
    
        END;
    END;
    

    이것은 당신에게 시간을 절약 희망

  4. ==============================

    4.당신은 날짜를 선언 한 후 SQL Developer에서 사용하십시오.

    당신은 날짜를 선언 한 후 SQL Developer에서 사용하십시오.

    DEFINE PROPp_START_DT = TO_DATE('01-SEP-1999')
    
    SELECT * 
    FROM proposal 
    WHERE prop_start_dt = &PROPp_START_DT
    
  5. ==============================

    5.그냥 마타스 '대답을 추가 할. 어쩌면 그것은 분명하지만 변수가 너무 나중에 몇 가지 코드에서 사용할 필요가 있다면, 당신은 시작 안쪽에이 코드를 삽입 할 필요가, 건축-END에게 BEGIN 단지 내부에 액세스 할 수 있는지 파악하는 데 시간이 오래 검색 한 -end 블록.

    그냥 마타스 '대답을 추가 할. 어쩌면 그것은 분명하지만 변수가 너무 나중에 몇 가지 코드에서 사용할 필요가 있다면, 당신은 시작 안쪽에이 코드를 삽입 할 필요가, 건축-END에게 BEGIN 단지 내부에 액세스 할 수 있는지 파악하는 데 시간이 오래 검색 한 -end 블록.

    이러한 블록이 중첩 될 수 있습니다 :

    DECLARE x NUMBER;
      BEGIN
        SELECT PK INTO x FROM table1 WHERE col1 = 'test';
    
        DECLARE y NUMBER;
        BEGIN
        SELECT PK INTO y FROM table2 WHERE col2 = x;
    
        INSERT INTO table2 (col1, col2)
          SELECT y,'text'
          FROM dual
          WHERE exists(SELECT * FROM table2);
        COMMIT;
      END;
    END;
    
  6. ==============================

    6.이 SQL * Plus를 사용됩니다 나에게 스크립트 수단에 변수를 사용하는 방법에 대한 질문입니다.

    이 SQL * Plus를 사용됩니다 나에게 스크립트 수단에 변수를 사용하는 방법에 대한 질문입니다.

    문제는 당신이 따옴표를 놓친 오라클이 번호로 값을 구문 분석 할 수 없습니다입니다.

    SQL> DEFINE num = 2018
    SQL> SELECT &num AS your_num FROM dual;
    old   1: SELECT &num AS your_num FROM dual
    new   1: SELECT 2018 AS your_num FROM dual
    
      YOUR_NUM
    ----------
          2018
    
    Elapsed: 00:00:00.01
    

    이 샘플 때문에 자동 타입 변환 (또는 무엇이든 그것이라고합니다)의 작품 괜찮습니다.

    당신은 SQL * Plus를 입력하여 DEFINE 체크하면 NUM 변수는 CHAR 보여줍니다 것이다.

    SQL>define
    DEFINE NUM             = "2018" (CHAR)
    

    오라클은 유효한 숫자 될 경우 숫자 문자열을 구문 분석 처리 할 수 ​​있기 때문에,이 경우에는 문제가되지 않습니다.

    때 오라클은 그것을 처리 할 수없는보다 문자열, 숫자로 구문 분석 할 수 없습니다.

    SQL> DEFINE num = 'Doh'
    SQL> SELECT &num AS your_num FROM dual;
    old   1: SELECT &num AS your_num FROM dual
    new   1: SELECT Doh AS your_num FROM dual
    SELECT Doh AS your_num FROM dual
           *
    ERROR at line 1:
    ORA-00904: "DOH": invalid identifier
    

    견적과 함께, 그래서 잘 될 것입니다, 숫자로 구문 분석에 오라클을 강제하지 않습니다

    17:31:00 SQL> SELECT '&num' AS your_num FROM dual;
    old   1: SELECT '&num' AS your_num FROM dual
    new   1: SELECT 'Doh' AS your_num FROM dual
    
    YOU
    ---
    Doh
    

    그래서, 원래의 질문에 대답, 그것은이 샘플과 같이 수행해야한다 :

    SQL> DEFINE stupidvar = 'X'
    SQL>
    SQL> SELECT 'print stupidvar:' || '&stupidvar'
      2  FROM dual
      3  WHERE dummy = '&stupidvar';
    old   1: SELECT 'print stupidvar:' || '&stupidvar'
    new   1: SELECT 'print stupidvar:' || 'X'
    old   3: WHERE dummy = '&stupidvar'
    new   3: WHERE dummy = 'X'
    
    'PRINTSTUPIDVAR:'
    -----------------
    print stupidvar:X
    
    Elapsed: 00:00:00.00
    

    SQL에 저장 변수 *에 플러스 쿼리의 열 값을 사용하여 다른 방법이있다.

    COL [UMN]는 쿼리에서 필드 이름에 값을 저장에 NEW_VALUE 옵션이 있습니다.

    SQL> COLUMN stupid_column_name new_value stupid_var noprint
    SQL> SELECT dummy || '.log' AS stupid_column_name
      2  FROM dual;
    
    Elapsed: 00:00:00.00
    SQL> SPOOL &stupid_var.
    SQL> SELECT '&stupid_var' FROM DUAL;
    old   1: SELECT '&stupid_var' FROM DUAL
    new   1: SELECT 'X.log' FROM DUAL
    
    X.LOG
    -----
    X.log
    
    Elapsed: 00:00:00.00
    SQL>SPOOL OFF;
    

    당신이 볼 수 있듯이, X.log 값은 우리가 현재 디렉토리에 X.log 파일을 찾을 수 있도록 stupid_var 변수로 설정 그것에 일부 로그를 가지고 있었다.

  7. ==============================

    7.여기 당신의 대답입니다 :

    여기 당신의 대답입니다 :

    DEFINE num := 1;       -- The semi-colon is needed for default values.
    SELECT &num FROM dual;
    
  8. ==============================

    8.두꺼비 나는이 작품을 사용 :

    두꺼비 나는이 작품을 사용 :

    declare 
        num number;
    begin 
        ---- use 'select into' works 
        --select 123 into num from dual;
    
        ---- also can use :=
        num := 123;
        dbms_output.Put_line(num);
    end;
    

    그런 다음 값은 DBMS 출력 창에 인쇄 될 것입니다.

    참조 여기 here2합니다.

  9. ==============================

    9.때때로 당신은 값을 입력하도록 사용자에게 요청하지 않고 매크로 변수를 사용해야합니다. 대부분의 경우이 옵션 스크립트 매개 변수와 함께 수행되어야한다. 다음 코드는 완벽하게 작동

    때때로 당신은 값을 입력하도록 사용자에게 요청하지 않고 매크로 변수를 사용해야합니다. 대부분의 경우이 옵션 스크립트 매개 변수와 함께 수행되어야한다. 다음 코드는 완벽하게 작동

    column 1 noprint new_value 1
    select '' "1" from dual where 2!=2;
    select nvl('&&1', 'VAH') "1" from dual;
    column 1 clear
    define 1
    

    유사 코드는 어떻게 든 RDBMS / sql 디렉토리에서 발견되었다.

  10. from https://stackoverflow.com/questions/3564283/how-to-declare-variable-and-use-it-in-the-same-oracle-sql-script by cc-by-sa and MIT license