Oracle SQL Developer에서 변수를 어떻게 사용합니까?


116

다음은 SQL Server 2000에서 변수를 사용하는 예입니다.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

추가 복잡성없이 SQL Developer를 사용하여 Oracle에서 똑같은 작업을 수행하고 싶습니다. 매우 간단한 것처럼 보이지만 간단한 해결책을 찾을 수 없습니다. 내가 어떻게 해?


저장 프로 시저 또는 스크립트로? EmpIDVar의 값을 하드 코딩하는 경우 왜 변수를 사용합니까?
kurosch 2011

답변:


95

버전 3.2에서 SQL-Developer를 사용하고 있습니다. 다른 것들은 나를 위해 작동하지 않았지만 이것은 작동했습니다.

define value1 = 'sysdate'

SELECT &&value1 from dual;

또한 여기에 제시된 가장 매끄러운 방법입니다.

( "define"부분을 생략하면 해당 값을 입력하라는 메시지가 표시됩니다)


12
&& 값 1 = '일부 문자열'다음 && 값 1의 요구와 같은 작은 따옴표로 포장하기 : 같은 문자열 값 && 값 1 비교는이 '&& 값 1'= '일부 문자열'
라이언 E

1
SQL Developer에서 DEFINE에 의해 정의 된 대체 변수는 쿼리 실행 사이에 영구적 인 것처럼 보입니다. 변수 값을 변경했지만 실행할 때 DEFINE 줄을 명시 적으로 강조 표시하지 않으면 이전 값이 유지됩니다. (더블 && 때문인가요?)
Baodad

9
섹션 2.4 의이 페이지 에서는 단일 앰퍼샌드 (&)와 이중 앰퍼샌드 (&&)의 차이점에 대해 설명합니다.
Baodad

1
Microsoft SQL Server Management Studio에서 변수를 사용하여 쿼리로 작업하는 데 익숙한 사용자에게는 이것이 최선의 대답입니다. 하지만 실행하기 전에 전체 쿼리를 강조하는 데 익숙해 져야 할 수도 있습니다.
Baodad 2014 년

이 답변은 SQL-Developer 2.1에서 저에게 효과적이었습니다. 사용자가 쿼리 위의 값을 변경하고 쿼리 자체를 편집 할 필요가 없도록하는 방법을 구현하는 가장 간단한 방법입니다.
YonkeyDonk64

74

SQL-plus에는 치환과 바인드의 두 가지 유형의 변수가 있습니다.

이것은 대체입니다 (대체 변수는 SQL * Plus 명령 옵션 또는 기타 하드 코딩 된 텍스트를 대체 할 수 있음).

define a = 1;
select &a from dual;
undefine a;

이다 바인드 (바인드 변수는 RDBMS에 실행 된 SQL 및 PL / SQL 문에 대한 데이터 값을 저장, 그들은 하나의 값 또는 전체 결과 집합을 저장할 수) :

var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;

SQL Developer는 대체 변수를 지원하지만 바인드 :var구문을 사용 하여 쿼리를 실행 하면 대화 상자에서 바인딩을 묻는 메시지가 나타납니다.

참고:

UPDATE 대체 변수는 사용하기가 약간 까다 롭습니다.

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string

2
SQL Developer (4.1.1.19)에서 바인드를 시도 했는데도 작동합니다. 나는 프롬프트가없는 var xand가 있는 경우를 의미 exec :x합니다.
Betlista 2016 년

50

SQL * Plus에서 매우 유사한 작업을 수행 할 수 있습니다.

SQL> variable v_emp_id number;
SQL> select 1234 into :v_emp_id from dual;

      1234
----------
      1234

SQL> select *
  2    from emp
  3   where empno = :v_emp_id;

no rows selected

SQL Developer에서 바인드 변수 (콜론 접두사)가있는 문을 실행하면 값을 입력하라는 메시지가 표시됩니다. Alex가 지적했듯이 Alex가 제안하는 대체 EXEC 구문과 함께 "Run Script"기능 (F5)을 사용하여 유사한 작업을 수행 할 수도 있습니다.

variable v_count number;
variable v_emp_id number;
exec :v_emp_id := 1234;
exec select count(1) into :v_count from emp;
select *
  from emp
 where empno = :v_emp_id
exec print :v_count;

14
'run statement'대신 'run script'(F5)하면 바인드 변수에 대한 프롬프트가 표시되지 않습니다. 그러나 select...into(ORA-01006) 을 좋아하지 않는 것 같으 므로 exec :v_emp_id := 1234;대신 해야 합니다.
Alex Poole 2011

@Alex-좋아요! 방금 포기하고 SQL Developer가 항상 바인드 변수 값을 요구한다고 가정했습니다. 나는 당신의 제안을 내 대답에 통합했습니다.
Justin Cave

1
@Nathan : v_emp_id로 패키지를 실행하려는 경우 refcursor에 바인드 변수를 사용할 수도 있습니다. 내가 가진 유사한 질문에 대한 Alex의 대답 의 하단을 참조하십시오
Conrad Frix 2011

2
@AlexPoole 쿼리 결과 창에 출력을 보내는 방법이 있습니까? 내 직장에서 쿼리를 실행하여 Excel 파일로 내 보냅니다.
tp9 2012-06-09

13

Ok 나는 이것이 약간의 해킹이라는 것을 알고 있지만 이것은 스크립트가 아닌 간단한 쿼리에서 변수를 사용하는 방법입니다.

WITH
    emplVar AS
    (SELECT 1234 AS id FROM dual)
SELECT
    *
FROM
    employees,
    emplVar
WHERE
    EmployId=emplVar.id;

어디서나 실행할 수 있습니다.


선택 대신 UPDATE와 함께 사용하는 방법이 있습니까?
론 젠슨 - 우리는 모니카 있습니다

12

간단한 대답 아니오.

그러나 바인드 변수를 사용하여 다음 버전을 실행하면 비슷한 결과를 얻을 수 있습니다.

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

SQL Developer에서 위의 쿼리를 실행하면 바인드 변수 EmployeeID에 대한 값을 입력하라는 메시지가 표시됩니다.


8

대체 변수에 대해 다른 곳에서 읽을 수 있습니다. SQL Developer에서 매우 편리합니다. 하지만 SQL Developer에서 바인드 변수를 사용하려는 시도에 적합합니다. 이것이 제가하는 것입니다:

SET SERVEROUTPUT ON
declare
  v_testnum number;
  v_teststring varchar2(1000);

begin
   v_testnum := 2;
   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);

   SELECT 36,'hello world'
   INTO v_testnum, v_teststring
   from dual;

   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);
   DBMS_OUTPUT.put_line('v_teststring is ' || v_teststring);
end;

SET SERVEROUTPUT ON 텍스트를 스크립트 출력 콘솔에 인쇄 할 수 있도록합니다.

여기서 우리가하는 일은 공식적으로 PL / SQL이라고합니다. 우리는 순수한 SQL 영역을 떠나 Oracle에서 다른 엔진을 사용하고 있습니다. 당신은 볼 수 SELECT위? PL / SQL에서는 항상 SELECT ... INTO변수 또는 refcursor가 필요합니다. SELECTPL / SQL에서 결과 집합을 반환 할 수는 없습니다 .


2

귀하의 경우 가장 쉬운 방법은 다음과 같습니다.

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

문자열 값의 경우 다음과 같습니다.

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

다음 쿼리를 사용하십시오.

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

오류 반환 "PLS-00428이 SELECT 문에 INTO 절이 필요합니다."
Thundter

0

이것을 시도하면 작동합니다. 절차를 생성하는 것이 좋습니다. 절차가 불가능한 경우이 스크립트를 사용할 수 있습니다.

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;

0

SQL 개발자에서는 기본적으로 "ON"으로 속성을 정의합니다. 어떤 경우에도 "OFF"이면 아래 단계를 사용하십시오.

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.