Jak używać zmiennych w Oracle SQL Developer?

116

Poniżej znajduje się przykład użycia zmiennych w SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Chcę zrobić dokładnie to samo w Oracle, używając SQL Developer bez dodatkowej złożoności. Wydaje się, że jest to bardzo prosta rzecz, ale nie mogę znaleźć prostego rozwiązania. Jak mogę to zrobić?

Nathan
źródło
Jako procedura składowana czy jako skrypt? Jeśli zakodujesz na stałe wartość EmpIDVar, po co w ogóle używać zmiennej?
kurosch

Odpowiedzi:

95

Używam SQL-Developer w wersji 3.2. Inne rzeczy nie działały dla mnie, ale to:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Jest to również najbardziej zręczny sposób zaprezentowany tutaj.

(Jeśli pominiesz część „zdefiniuj”, zostanie wyświetlony monit o podanie tej wartości)

Omphaloskopie
źródło
12
Jeśli porównujesz && wartość1 z wartością ciągu, taką jak: && wartość1 = 'Jakiś ciąg', to && wartość1 musi być ujęta w pojedyncze cudzysłowy, np .: '&& wartość1' = 'Jakiś ciąg'
Ryan E
1
W SQL Developer zmienne podstawienia zdefiniowane przez DEFINE wydają się być trwałe między wykonaniami zapytań. Jeśli zmienię wartość zmiennej, ale nie podświetlę wyraźnie wiersza DEFINE podczas wykonywania, poprzednia wartość pozostanie. (Czy to z powodu podwójnego &&?)
Baodad
9
Ta strona w sekcji 2.4 omawia różnicę między pojedynczym ampersandem (&) i podwójnym ampersandem (&&)
Baodad
1
Dla tych z nas, którzy przywykli do pracy z zapytaniami ze zmiennymi w Microsoft SQL Server Management Studio, jest to najlepsza odpowiedź. Być może będziemy musieli przyzwyczaić się do podświetlania całego zapytania przed wykonaniem.
Baodad
Ta odpowiedź była rozwiązaniem, które działało dla mnie w SQL-Developer 2.1. Jest to zdecydowanie najprostsza metoda implementacji sposobu, w jaki użytkownik może zmienić wartość nad zapytaniem i nie musi edytować samego zapytania.
YonkeyDonk64
74

Istnieją dwa typy zmiennych w SQL-plus: podstawianie i wiązanie.

To jest podstawienie (zmienne podstawienia mogą zastąpić opcje polecenia SQL * Plus lub inny tekst zakodowany na stałe):

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

To jest bind (zmienne wiązania przechowują wartości danych dla instrukcji SQL i PL / SQL wykonywanych w RDBMS; mogą zawierać pojedyncze wartości lub pełne zestawy wyników):

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

SQL Developer obsługuje zmienne podstawienia, ale gdy wykonujesz zapytanie z bind :var składnią się monit o powiązanie (w oknie dialogowym).

Odniesienie:

Zmienne podstawiania UPDATE są nieco trudne w użyciu, spójrz:

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
gavenkoa
źródło
2
Próbowałem powiązania w SQL Developer (4.1.1.19) i też działa. Mam na myśli przypadek z var xi exec :x, bez zachęty.
Betlista
50

W SQL * Plus możesz zrobić coś bardzo podobnego

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

W SQL Developer, jeśli uruchomisz instrukcję, która ma dowolną liczbę zmiennych wiążących (poprzedzonych dwukropkiem), zostaniesz poproszony o wprowadzenie wartości. Jak wskazuje Alex, możesz również zrobić coś podobnego za pomocą funkcji „Uruchom skrypt” (F5) z alternatywną składnią EXEC, którą sugeruje 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;
Justin Cave
źródło
14
jeśli 'uruchomisz skrypt' (F5) zamiast 'uruchom instrukcję', to nie będzie pytać o zmienne wiązania. Ale wydaje się, że nie podoba mu się select...into(ORA-01006), więc exec :v_emp_id := 1234;zamiast tego musisz to zrobić .
Alex Poole,
@Alex - Nice! Po prostu poddałem się i założyłem, że SQL Developer zawsze monitował o powiązanie wartości zmiennych. Uwzględniłem twoje sugestie w mojej odpowiedzi.
Justin Cave
1
@Nathan, jeśli chcesz wykonać pakiet z: v_emp_id, możesz również użyć zmiennych wiążących dla refcursorów. Zobacz dno Alexa odpowiedzi na podobne pytanie miałem
Conrad Frix
2
@AlexPoole czy istnieje sposób na wysłanie danych wyjściowych do okna wyników zapytania? W swojej pracy wykonuję zapytania o eksport do plików Excel.
tp9
13

Ok, wiem, że to trochę hack, ale jest to sposób na użycie zmiennej w prostym zapytaniu, a nie skrypcie:

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

Możesz go uruchomić wszędzie.

zpontikas
źródło
Czy istnieje sposób, aby użyć tego z UPDATE zamiast wybierać?
Ron Jensen - Wszyscy jesteśmy Monicą
12

Prosta odpowiedź NIE.

Jednak możesz osiągnąć coś podobnego, uruchamiając następującą wersję przy użyciu zmiennych powiązań:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Po uruchomieniu powyższego zapytania w SQL Developer zostaniesz poproszony o wprowadzenie wartości zmiennej powiązanej EmployeeID.

Chandu
źródło
8

Możesz przeczytać gdzie indziej o zmiennych podstawianych; są całkiem przydatne w SQL Developer. Ale mam pasowania, próbując użyć zmiennych wiążących w SQL Developer. Tym się właśnie zajmuję:

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 sprawia, że ​​tekst może być wydrukowany na konsoli wyjścia skryptu.

Uważam, że to, co tutaj robimy, oficjalnie nazywa się PL / SQL. Opuściliśmy czystą krainę SQL i używamy innego silnika w Oracle. Widzisz SELECTpowyższe? W PL / SQL zawsze musisz mieć SELECT ... INTOzmienną lub refcursor. Nie możesz po prostu SELECTzwrócić wyniku w PL / SQL.

Baodad
źródło
2

Myślę, że najłatwiejszym sposobem w Twoim przypadku jest:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Dla wartości łańcuchowych będzie to wyglądać następująco:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Piotr
źródło
1

Użyj następnego zapytania:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
Ivan Gerasimenko
źródło
zwrócony błąd „PLS-00428 oczekuje się klauzuli INTO w tej instrukcji SELECT”
Thundter
0

Spróbuj, to zadziała, lepiej utwórz procedurę, jeśli procedura nie jest możliwa, możesz użyć tego skryptu.

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
Jeen Jose Akkanath
źródło
0

W programistach sql definiuj właściwości domyślnie „ON”. Jeśli tak czy inaczej, wykonaj poniższe czynności.

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

Md. Kamruzzaman
źródło