2013-03-28 2 views
2

Я пытаюсь определить переменные в файле .sql, чтобы я мог использовать их в своих учетных записях sql. Но я так смущен тем, как эти переменные определены, и я не могу найти ни одного хорошего интернет-ресурса, который объяснил бы все это ясным образом. Я следую рекомендациям в разных источниках, и я продолжаю получать ошибки компиляции в «Oracle SQL Developer». Вот мои 2 проблемы:Определение и использование переменных в сценариях .sql

Проблема 1: Кажется, что вы можете определить переменные следующими двумя способами. В чем разница между этими двумя способами, и могу ли я использовать их оба?

define first_name = Joe; 
select * from customer where name = '&firstname'; 

или

variable first_name CHAR; 
exec :first_name:= 'Joe'; 
select * from customer where name = :firstname; 

Задача 2: В первом методе (то есть с помощью команды определения), можно определить переменную числа типа, и если да, то как я могу это сделать?

+0

Похоже, что вы забыли завершить первую строку в первом блоке кода точкой с запятой. Кроме того, это может помочь, если вы публикуете ошибки компиляции, которые вы получаете. –

+0

Краткий ответ на проблему 2: нет. См. Также http://stackoverflow.com/a/7783530. –

+0

@ user1888243 - Я расширил свой ответ, чтобы описать разницу между «проблемой 1» и «проблемой 2». Люк прав, что короткий ответ на «проблему 2» - нет; надеюсь, мой расширенный ответ объясняет, почему. –

ответ

2

- Ответ на проблему 1: Первый тип переменных называется переменными замещения, которые работают только в SQL * Plus и SQL Developer. Поэтому, когда вы предоставляете подстановку vaiable в любом SQL-выражении, SQL * Plus заменяет переменную на ее значение. Он не имеет ничего общего с сервером Oracle или производительностью. пример вы дали, будут переведены на follwing перед отправкой его на сервер базы данных Oracle:

select * from customer where name = 'Joe'; 

Вторая часть называется переменных связывания, которая не является эксклюзивом для SQL * Plus или SQL Developer, как вы можете использовать его , например, в Java-приложении (или других языках), подключающемся к Oracle. Переменные связывания обеспечивают лучшую производительность при многократном запуске одного и того же оператора, поскольку вы всегда отправляете инструкцию как есть (без перезаписи). Затем переменные оцениваются на уровне базы данных. Например, предположим, что вы изменили значение «first_name» до «Марка»:

exec :first_name:= 'Mark'; 

тот же оператор с переменной связывания передается на сервер базы данных Oracle. База данных использует кешированную область, чтобы найти, что тот же самый оператор был запущен и использует его снова. Затем база данных использует значения переменных. Это означает, что для базы данных не потребуется повторно анализировать и перерасчитывать лучший план выполнения для одного и того же оператора. Но это не относится к первому типу (переменные замещения). не

- Ответ к задаче 2: Нет, вы не можете, потому что, как я уже говорил выше, все, что SQL * Plus или SQL Developer сделать, это просто переписав заявление, заменяющее имя переменного с его значением. Он ничего не знает об этом типе. Здесь выполняется только замена текста.

Вы можете найти более подробную информацию здесь: http://www.oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php

0

В Oracle, вы можете определить переменные следующим образом:

CREATE OR REPLACE FUNCTION MyFunction() 
AS 

    my_number  NUMBER (20, 0); 
    first_name VARCHAR2(256); 

BEGIN 
    first_name := 'Joe'; 
    select * from customer where name = first_name; 

END 

Это то, что вы ищете?

+0

Спасибо за ваш ответ. Дело в том, что это делает третий синтаксис, который я могу использовать. Почему все разные способы определения переменной и в чем их отличие? Все эти синтаксисы созданы Oracle? – user1888243

+0

@User .... Я не знаю, какой из них лучше для вашей ситуации. Я использую Oracle 10, и это предпочтительный метод для нас в Oracle 10 – MikeTWebb

+0

Кроме того, я использовал приведенный выше синтаксис, и я получаю «Bind Variable» my_number «NOT DECLARED». Таким образом, синтаксис не работает. – user1888243

3

Вы не можете определить NUMBER переменные не проблема:

SQL> VARIABLE myNum NUMBER; 
SQL> EXEC :myNum := 123.456; 

PL/SQL procedure successfully completed. 

SQL> print myNum; 

    MYNUM           
----------           
    123.456           

Много других типов поддерживаются также. Вот USAGE текст справки из ИЗМЕНЯЕМЫХ команд:

Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) | 
       VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) | 
       NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE 
       REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ] 

Если вы наберете VARIABLE (или просто VAR) без чего-либо еще, SQL * Plus будет перечислить все переменные с их значениями.

Addendum: сопоставьте два стиля присваивания переменных в исходном вопросе.

Когда вы сделаете это ...

define first_name = Joe 
select * from customer where name = '&first_name'; 

... Это больше похоже на #define в C/C++. Вы не можете относиться к нему как к переменной; это просто текст, который приклеивается каждый раз, когда SQL * Plus видит &first_name.

Когда вы сделаете это ...

variable first_name CHAR; 
exec :first_name:= 'Joe'; 
select * from customer where name = :first_name; 

Вы создаете реальную переменную, которую можно манипулировать.

Обратите внимание, что если вы используете CHAR в определении (без размера), первое присваивание определит его размер, и вы не сможете сделать это дольше после этого. Если вы определяете его как CHAR(50), он всегда будет содержать 50 символов и заполняется пробелами. Это может ввести в заблуждение, поэтому я бы рекомендовал VARCHAR2 в большинстве случаев для строк.

+1

Вот что я действительно на самом деле; разница между двумя методами. Удивительно, что для таких, как зрелые программное обеспечение и промышленность, нет онлайн-источников, которые логически объясняют это. Я не понимаю, и документация Oracle в этих областях сосать. – user1888243

Смежные вопросы