Як я можу використовувати змінні в 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-розробник у версії 3.2. Інші речі не працювали для мене, але це:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Також це найрізший спосіб, представлений тут, поки.

(Якщо ви пропустите частину "визначити", вам буде запропоновано це значення)


12
Якщо порівнювати && value1 зі значенням рядка, таким як: && value1 = 'Деякий рядок', то && value1 потрібно загорнути в одинарні лапки, як-от: '&& value1' = 'Деякий рядок'
Ryan E

1
У SQL Developer змінні підстановки, визначені DEFINE, здаються стійкими між виконанням запитів. Якщо я змінюю значення змінної, але явно не виділяю рядок DEFINE під час виконання, попереднє значення залишається. (Це через подвійне &&?)
Баодад

9
Ця сторінка у розділі 2.4 розповідає про різницю між одиночною амперсандою (&) та подвійною амперсандою (&&)
Баодад

1
Для тих, хто звик працювати з запитами зі змінними в Microsoft SQL Server Management Studio, це найкраща відповідь. Можливо, нам потрібно буде звикнути до виділення цілого запиту перед виконанням.
Баодад

Ця відповідь стала рішенням, яке працювало для мене в SQL-Developer 2.1. Це, безумовно, найпростіший спосіб реалізувати спосіб для користувача змінити значення над запитом, а не редагувати сам запит.
YonkeyDonk64

74

У SQL-плюс є два типи змінної: підміна і прив'язка.

Це підміна (змінні заміни можуть замінити параметри команд 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 Developer підтримує змінні підстановки, але коли ви виконуєте запит з bind :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 xі exec :x, без підказки.
Бетліста

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, якщо ви запустите оператор, який містить будь-яку кількість змінних прив'язки (з префіксом двокрапкою), вам буде запропоновано ввести значення. Як зазначає Алекс, ви також можете зробити щось подібне, використовуючи функцію "Запустити сценарій" (F5) з альтернативним синтаксисом EXEC, який Алекс пропонує.

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 - Приємно! Я просто відмовився і припустив, що SQL Developer завжди вимагав прив'язувати змінні значення. Я включив ваші пропозиції у свою відповідь.
Джастін Печера

1
@Nathan, якщо ви хочете виконати пакет з: v_emp_id, ви можете використовувати змінні змінні і для рекурсорів. Дивіться в нижній частині Алекса відповідь на аналогічне питання , який я мав
Конрад Frix

2
@AlexPoole чи є спосіб надіслати вихід у вікно Результат запиту? У своїй роботі я запускаю запити щодо експорту в файли Excel.
tp9

13

Ок, я знаю, це трохи хак, але це спосіб використовувати змінну в простому запиті, а не в сценарії:

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змінювати чи рекурсор. Ви не можете просто 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. У цій заяві SELECT очікується пункт INTO"
Thunderter

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';

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.