programing

Select 문에서 변수 선언 및 설정

batch 2023. 6. 15. 21:43
반응형

Select 문에서 변수 선언 및 설정

Oracle에서 일부 변수를 선언하고 select 문에 사용하는 간단한 쿼리를 작성하려고 합니다.이전에 SQL Server에서 다음과 같은 작업을 수행한 적이 있습니다.

DECLARE @date1   DATETIME
SET @date1 = '03-AUG-2010'

SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1

검색한 결과 Select 문에서 이와 같은 변수를 선언하고 설정할 수 없습니다.이게 맞는 건가요, 아니면 제가 뭔가를 놓치고 있는 건가요?

검색한 결과 Select 문에서 이와 같은 변수를 선언하고 설정할 수 없습니다.이게 맞는 건가요, 아니면 제가 뭔가 놓친 건가요?

Oracle PL/SQL 및 SQL에는 두 개의 개별 엔진이 있는 두 개의 개별 언어가 있습니다.PL/SQL 내에 SQL DML을 포함할 수 있으며, 그러면 변수가 생성됩니다.다음과 같은 익명 PL/SQL 블록.참고:/PL/SQL의 일부가 아니라 SQL*Plus에 이전 블록을 전송하도록 지시합니다.

declare 
    v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
    v_Count number;
begin
    select count(*) into v_Count
    from Usage
    where UseTime > v_Date1;
    dbms_output.put_line(v_Count);
end;
/

문제는 T-SQL 코드와 동일한 블록이 작동하지 않는다는 것입니다.

SQL> declare 
  2      v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
  3  begin
  4      select VisualId
  5      from Usage
  6      where UseTime > v_Date1;
  7  end;
  8  /
    select VisualId
    *
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

PL/SQL(익명 블록, 저장 프로시저 또는 저장 함수)에서 쿼리 결과를 전달하려면 커서를 선언하고 열고 호출 프로그램으로 반환해야 합니다.(이 질문에 대답할 수 있는 범위를 벗어납니다.편집: Oracle 저장 프로시저에서 결과 집합 가져오기 참조)

데이터베이스에 연결되는 클라이언트 도구에는 자체 바인딩 변수가 있을 수 있습니다.SQL*Plus의 경우:

SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';

PL/SQL procedure successfully completed.

SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
  2  from Usage
  3  where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');

no rows selected

위의 내용은 SQL Plus에 있으며 Toad PL/SQL 개발자 등에서는 작동하지 않을 있습니다. 변수와 exec로 시작하는 행은 SQL Plus 명령입니다.SQL 또는 PL/SQL 명령이 아닙니다.테이블이 비어 있으므로 선택한 행이 없습니다.

저는 이것을 시도해 보았고 효과가 효과가 있었습니다.

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

select * from proposal where prop_start_dt = &PROPp_START_DT

 

SET명령어는 TSQL에 따라 다릅니다. 여기에 게시한 내용과 동일한 PLSQL이 있습니다.

v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY');

SELECT u.visualid
  FROM USAGE u 
 WHERE u.usetime > v_date1;

또한 변수 앞에 "@"를 붙이지 않아도 됩니다. 변수와 열/등을 구분하기 위해 변수 앞에 "v_"를 붙입니다.

Oracle에 해당하는 NOLOCK에 대해스레드를 참조하십시오.

to_date 함수를 사용해 보십시오.

SQL Server에서도 마찬가지입니다. 정말 짜증이 났습니다.Toad Data Point 또는 Toad for Oracle을 사용하는 사용자의 경우 매우 간단합니다.변수 이름 앞에 콜론을 배치하기만 하면 Toad에서 실행 시 값을 입력하는 대화 상자를 열도록 요청합니다.

SELECT * FROM some_table WHERE some_column = :var_name;

언급URL : https://stackoverflow.com/questions/3400058/declaring-setting-variables-in-a-select-statement

반응형