변수를 선언하고 동일한 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
창문이요.
답변은 다음과 같습니다.
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
'programing' 카테고리의 다른 글
배열의 일부 속성이 있는 항목 수 가져오기 (0) | 2023.03.13 |
---|---|
스테이트리스 컴포넌트의 컨텍스트 (0) | 2023.03.13 |
react JS에서 버튼 누름으로 링크 클릭을 호출하려면 어떻게 해야 합니까? (0) | 2023.03.13 |
WordPress용 html 편집기(TinyMCE)에 P 태그가 표시되지 않음 (0) | 2023.03.13 |
woocommerce에서 페이지가 카테고리인지 제품인지 확인하는 방법 (0) | 2023.03.13 |