다음은 SQL Server 2000에서 변수를 사용하는 예입니다.
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
추가 복잡성없이 SQL Developer를 사용하여 Oracle에서 똑같은 작업을 수행하고 싶습니다. 매우 간단한 것처럼 보이지만 간단한 해결책을 찾을 수 없습니다. 내가 어떻게 해?
다음은 SQL Server 2000에서 변수를 사용하는 예입니다.
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
추가 복잡성없이 SQL Developer를 사용하여 Oracle에서 똑같은 작업을 수행하고 싶습니다. 매우 간단한 것처럼 보이지만 간단한 해결책을 찾을 수 없습니다. 내가 어떻게 해?
답변:
버전 3.2에서 SQL-Developer를 사용하고 있습니다. 다른 것들은 나를 위해 작동하지 않았지만 이것은 작동했습니다.
define value1 = 'sysdate'
SELECT &&value1 from dual;
또한 여기에 제시된 가장 매끄러운 방법입니다.
( "define"부분을 생략하면 해당 값을 입력하라는 메시지가 표시됩니다)
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
var x
and가 있는 경우를 의미 exec :x
합니다.
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;
select...into
(ORA-01006) 을 좋아하지 않는 것 같으 므로 exec :v_emp_id := 1234;
대신 해야 합니다.
Ok 나는 이것이 약간의 해킹이라는 것을 알고 있지만 이것은 스크립트가 아닌 간단한 쿼리에서 변수를 사용하는 방법입니다.
WITH
emplVar AS
(SELECT 1234 AS id FROM dual)
SELECT
*
FROM
employees,
emplVar
WHERE
EmployId=emplVar.id;
어디서나 실행할 수 있습니다.
대체 변수에 대해 다른 곳에서 읽을 수 있습니다. 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가 필요합니다. SELECT
PL / SQL에서 결과 집합을 반환 할 수는 없습니다 .
다음 쿼리를 사용하십시오.
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;
이것을 시도하면 작동합니다. 절차를 생성하는 것이 좋습니다. 절차가 불가능한 경우이 스크립트를 사용할 수 있습니다.
with param AS(
SELECT 1234 empid
FROM dual)
SELECT *
FROM Employees, param
WHERE EmployeeID = param.empid;
END;
SQL 개발자에서는 기본적으로 "ON"으로 속성을 정의합니다. 어떤 경우에도 "OFF"이면 아래 단계를 사용하십시오.
set define on;
define batchNo='123';
update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';