programing

변수를 선언하고 동일한 Oracle SQL 스크립트에서 사용하는 방법은 무엇입니까?

bestprogram 2023. 3. 13. 21:11

변수를 선언하고 동일한 Oracle SQL 스크립트에서 사용하는 방법은 무엇입니까?

재사용 가능한 코드를 작성하고, 처음에 몇 가지 변수를 선언하고, 스크립트에서 다음과 같은 변수를 재사용해야 합니다.

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;

변수를 선언하고 SQLDeveloper 사용 등 이어지는 문장에서 재사용하려면 어떻게 해야 합니까?


시도

  • DECLARE 섹션을 사용하여 다음 SELECT 문을 삽입합니다.BEGIN그리고.END;. 변수를 액세스합니다.&stupidvar.
  • 키워드 사용DEFINE변수에 액세스합니다.
  • 키워드 사용VARIABLE변수에 액세스합니다.

그러나 시도 중에 모든 종류의 오류가 발생합니다(Unbound variable, Syntax error, Expected).SELECT INTO...).

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>

VAR은 OUT 파라미터 또는 함수를 가진 스토어드 프로시저를 호출하는 경우에 특히 유용합니다.

대체 변수를 사용할 수도 있습니다.인터랙티브모드에는 다음과 같은 것이 적합합니다.

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>

char 변수인 경우 큰따옴표를 사용합니다.

DEFINE stupidvar = "'stupidvarcontent'";

또는

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata  
FROM stupidtable  
WHERE stupidcolumn = '&stupidvar'

갱신:

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

PL/SQL v.10에서는

키워드 declare는 변수를 선언하기 위해 사용됩니다.

DECLARE stupidvar varchar(20);

값을 할당하려면 선언할 때 설정할 수 있습니다.

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

또는 당신이 사용하는 변수에 어떤 것을 선택하기 위해INTO단, 스테이트먼트를 랩핑해야 합니다.BEGIN그리고.END또한 세미콜론을 잊지 말고 단일 값만 반환해야 합니다.

따라서 전체 진술은 다음과 같이 발표됩니다.

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

변수는 다음 범위 내에서만 사용할 수 있습니다.BEGIN그리고.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;

이것으로 시간이 절약되기를 바랍니다.

날짜를 선언한 다음 SQL Developer에서 사용하려면 다음과 같이 하십시오.

DEFINE PROPp_START_DT = TO_DATE('01-SEP-1999')

SELECT * 
FROM proposal 
WHERE prop_start_dt = &PROPp_START_DT

이 질문은 스크립트 내의 변수를 사용하는 것으로 SQL*Plus에서 사용되는 것을 의미합니다.

문제는 따옴표를 놓쳤다는 것입니다.또한 Oracle은 이 값을 숫자로 해석할 수 없습니다.

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에서 DEFAINE을 입력하여 체크하면 num 변수가 CHAR임을 나타냅니다.

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

이 경우 Oracle은 유효한 숫자일 경우 문자열의 번호에 대한 해석을 처리할 수 있기 때문에 문제가 되지 않습니다.

문자열이 숫자로 구문 분석할 수 없는 경우 Oracle이 처리할 수 없습니다.

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

견적서를 첨부하면 Oracle이 숫자에 맞게 해석하도록 강요하지 않아도 됩니다.

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

Query Column Value를 사용하여 변수를 SQL*Plus에 저장하는 다른 방법도 있습니다.

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 값은 studp_var 변수로 설정되어 있기 때문에 현재 디렉토리의 X.log 파일에 로그가 포함되어 있습니다.

마타스의 답변을 추가하고 싶을 뿐이야.분명하지만 오랫동안 검색한 결과 변수는 BEGIN-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;

Toad에서 다음 작업을 사용합니다.

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 Output창문이요.

여기 및 여기 참조2.

답변은 다음과 같습니다.

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

'어울리다'를 사용할 수 요.with a " " 에서 필터 기준을 합니다.where a까지join.

여기서 도움이 됩니다.정의(DEFINE)를 사용하는 대신 Oracle SQL을 사용합니다.

with
 mytab as (select 'stupidvarcontent' as myvar from dual)
SELECT
 stupiddata
FROM
  stupidtable a 
 inner join
  mytab b
 on
  a.stupidcolumn = b.myvar
WHERE ...;

Oracle 12R2입니다.
SQL을 사용합니다.
ANSI를 사용하다
SQL Developer: SQL Developer:

파라미터를 한 번만 지정하고 여러 곳에서 복제해야 하는 경우 다음과 같은 방법을 사용할 수 있습니다.

SELECT
  str_size  /* my variable usage */
  , LPAD(TRUNC(DBMS_RANDOM.VALUE * POWER(10, str_size)), str_size, '0') rand
FROM
  dual  /* or any other table, or mixed of joined tables */
  CROSS JOIN (SELECT 8 str_size FROM dual);  /* my variable declaration */

이 코드는 8자리 랜덤 문자열을 생성합니다.

, 그럼 제가 이런 .str_size하게 8쿼리에서 두 번 이상 사용할 수 있도록 교차 결합됩니다.

사용자에게 값을 입력하도록 요청하지 않고 매크로 변수를 사용해야 할 수 있습니다.대부분의 경우 이 작업은 옵션의 스크립트 파라미터를 사용하여 수행해야 합니다.다음 코드는 완전히 작동합니다.

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 디렉토리에서 발견되었습니다.

언급URL : https://stackoverflow.com/questions/3564283/how-to-declare-variable-and-use-it-in-the-same-oracle-sql-script