ฉันจะใช้ตัวแปรใน Oracle SQL Developer ได้อย่างไร


116

ด้านล่างนี้เป็นตัวอย่างของการใช้ตัวแปรใน SQL Server 2000

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

ฉันต้องการทำสิ่งเดียวกันใน Oracle โดยใช้ SQL Developer โดยไม่มีความซับซ้อนเพิ่มเติม ดูเหมือนเป็นสิ่งที่ง่ายมากที่ต้องทำ แต่ฉันหาวิธีง่ายๆไม่ได้ ฉันจะทำมันได้อย่างไร?


เป็นกระบวนงานที่เก็บไว้หรือเป็นสคริปต์? หากคุณกำลังฮาร์ดโค้ดค่าสำหรับ EmpIDVar ทำไมต้องใช้ตัวแปรเลย
kurosch

คำตอบ:


95

ฉันใช้ SQL-Developer ในเวอร์ชัน 3.2 สิ่งอื่น ๆ ไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้:

define value1 = 'sysdate'

SELECT &&value1 from dual;

ยังเป็นวิธีที่เนียนที่สุดที่นำเสนอที่นี่

(หากคุณละเว้น "กำหนด" - ส่วนหนึ่งคุณจะได้รับแจ้งสำหรับค่านั้น)


12
หากเปรียบเทียบ && value1 กับค่าสตริงเช่น: && value1 = 'Some string' ดังนั้น && value1 จะต้องอยู่ในเครื่องหมายคำพูดเดียวเช่น: '&& value1' = 'Some string'
Ryan E

1
ใน SQL Developer ตัวแปรทดแทนที่กำหนดโดย DEFINE ดูเหมือนจะคงอยู่ระหว่างการดำเนินการค้นหา หากฉันเปลี่ยนค่าตัวแปร แต่ไม่เน้นบรรทัด DEFINE อย่างชัดเจนเมื่อดำเนินการค่าก่อนหน้านี้จะยังคงอยู่ (นี่เป็นเพราะ double && หรือเปล่า)
Baodad

9
หน้านี้ในส่วน 2.4 พูดถึงความแตกต่างระหว่างเครื่องหมายแอม
เปอร์

1
สำหรับพวกเราที่เคยทำงานกับแบบสอบถามที่มีตัวแปรใน Microsoft SQL Server Management Studio นี่คือคำตอบที่ดีที่สุด เราอาจต้องคุ้นเคยกับการเน้นข้อความค้นหาทั้งหมดก่อนที่จะดำเนินการ
Baodad

คำตอบนี้เป็นวิธีแก้ปัญหาที่เหมาะกับฉันใน SQL-Developer 2.1 เป็นวิธีที่ตรงไปตรงมาที่สุดในการนำวิธีที่ผู้ใช้เปลี่ยนค่าเหนือข้อความค้นหาและไม่ต้องแก้ไขแบบสอบถามเอง
YonkeyDonk64

75

ตัวแปรใน SQL-plus มีสองประเภท: การทดแทนและการโยง

นี่คือการทดแทน (ตัวแปรทดแทนสามารถแทนที่ตัวเลือกคำสั่ง SQL * Plus หรือข้อความฮาร์ดโค้ดอื่น ๆ ):

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

นี่คือการผูก (ตัวแปรการผูกจะเก็บค่าข้อมูลสำหรับคำสั่ง SQL และ PL / SQL ที่ดำเนินการใน RDBMS โดยสามารถเก็บค่าเดียวหรือชุดผลลัพธ์ที่สมบูรณ์):

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

ผู้พัฒนา SQL สนับสนุนตัวแปรทดแทน แต่เมื่อคุณเรียกใช้แบบสอบถามด้วย:varไวยากรณ์การผูกคุณจะได้รับพร้อมท์สำหรับการโยง (ในกล่องโต้ตอบ)

อ้างอิง:

ตัวแปรทดแทนการอัปเดตใช้งานได้ค่อนข้างยากดู:

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 xและexec :xไม่มีข้อความแจ้ง
Betlista

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 ชี้ให้เห็นคุณสามารถทำสิ่งที่คล้ายกันได้โดยใช้ฟังก์ชัน "Run Script" (F5) ด้วยไวยากรณ์ EXEC ทางเลือกที่ Alex แนะนำ

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
หากคุณ 'เรียกใช้สคริปต์' (F5) แทน 'รันคำสั่ง' ระบบจะไม่แจ้งให้ป้อนตัวแปรการผูก แต่ดูเหมือนจะไม่ชอบselect...into(ORA-01006) ดังนั้นคุณต้องทำexec :v_emp_id := 1234;แทน
Alex Poole

@ อเล็กซ์ - ดี! ฉันเพิ่งยอมแพ้และคิดว่า SQL Developer มักจะแจ้งให้ผูกค่าตัวแปร ฉันรวมคำแนะนำของคุณไว้ในคำตอบของฉัน
Justin Cave

1
@ นาธานหากคุณต้องการเรียกใช้แพ็คเกจด้วย: v_emp_id คุณสามารถใช้ตัวแปรการโยงสำหรับตัวอ้างอิงได้เช่นกัน ดูคำตอบของ Alex สำหรับคำถามที่คล้ายกันที่ฉันมี
Conrad Frix

2
@AlexPoole มีวิธีส่งผลลัพธ์ไปยังหน้าต่าง Query Result หรือไม่? ในงานของฉันฉันเรียกใช้แบบสอบถามเพื่อส่งออกไปยังไฟล์ Excel
tp9

13

โอเคฉันรู้ว่านี่เป็นการแฮ็กเล็กน้อย แต่นี่เป็นวิธีใช้ตัวแปรในการสืบค้นธรรมดาไม่ใช่สคริปต์:

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

คุณสามารถเรียกใช้งานได้ทุกที่


มีวิธีใช้กับ UPDATE แทนการเลือกหรือไม่?
Ron Jensen - เราทุกคนคือ Monica

12

คำตอบง่ายๆ NO

อย่างไรก็ตามคุณสามารถบรรลุสิ่งที่คล้ายกันได้โดยเรียกใช้เวอร์ชันต่อไปนี้โดยใช้ตัวแปรการผูก:

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ตัวแปรหรือตัวอ้างอิงเสมอ คุณไม่สามารถSELECTและส่งคืนผลลัพธ์ที่กำหนดใน PL / 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 คาดว่าจะมีส่วนคำสั่ง INTO ในคำสั่ง SELECT นี้"
Thundter

0

ลองใช้วิธีนี้จะได้ผลดีกว่าสร้างโพรซีเดอร์หากขั้นตอนเป็นไปไม่ได้คุณสามารถใช้สคริปต์นี้ได้

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

0

ใน sql developer กำหนดคุณสมบัติตามค่าเริ่มต้น "ON" หากอยู่ในสถานะ "ปิด" ให้ใช้ขั้นตอนด้านล่าง

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.