Переменные в PL / SQL - PullRequest
       9

Переменные в PL / SQL

0 голосов
/ 25 июня 2010

Я работаю над довольно большим сценарием SQL, который будет использоваться с Oracle, но у меня возникла проблема. Сначала позвольте мне рассказать, как работает скрипт.

  1. Объявление переменных
    • `CUSTOMERID NUMBER;`
    • `SERVERID NUMBER;`
  2. Создать клиента, если он не существует
  3. `ВЫБЕРИТЕ ID В CUSTOMERID ОТ КЛИЕНТА, ГДЕ ИМЯ = 'Клиент, которого я только что вставил';`
  4. Создайте сервер, если он не существует, используя значение `CUSTOMERID`, чтобы связать сервер с клиентом.
  5. `ВЫБРАТЬ ИД В СЕРВЕРИДЕ, ГДЕ ХОЗЯЙКА = 'the.server.i.just.created';`
  6. Для каждой службы, принадлежащей этому серверу, вставьте службу, используя значение `SERVERID`, чтобы связать службу с сервером.
  7. Перейти к 2

Теперь этот процесс работает хорошо только для одного клиента с 15 серверами, каждый из которых имеет 6 сервисов. Но как только появляется следующий клиент, я получаю подсказки для замены переменных. То, как я использую переменные в моей вставке, довольно просто:

INSERT INTO SERVERS(CUSTOMER_ID, HOSTNAME)
SELECT CUSTOMERID, 'the.server.i.just.created' FROM DUAL
WHERE NOT EXISTS (
    SELECT *
    FROM SERVERS
    WHERE HOSTNAME = 'the.server.i.just.created'
);

Я также пытался использовать метод DECLARE ... BEGIN ... END;, но я получаю те же общие результаты. Некоторые примеры, которые я видел, предлагают использовать переменные стиля :CUSTOMERID, но они, похоже, не работают вообще, где они заканчиваются нулевыми значениями, что не должно происходить с учетом предыдущих запросов.

Мне нужна помощь в понимании того, как этого достичь. У меня очень ограниченный доступ к производственной среде, поэтому все, что я делаю, должно быть базовым (например, никаких новых функций, типов или процедур).

Ответы [ 2 ]

3 голосов
/ 26 июня 2010

Я действительно наткнулся на ответ, несколько раз ударившись головой о стол.

По сути, то, что происходило, заключалось в том, что у некоторых имен клиентов были амперсанды, и слово, следующее за амперсандом, пыталось связать как переменную. Решение было SET DEFINE OFF;, и все было хорошо после этого.

Спасибо всем за ваше время и внимание.

1 голос
/ 26 июня 2010

Вы можете избежать некоторых запросов, используя предложение RETURNING .Например:

SQL> var v number
SQL> print v
v
---------


SQL> insert into demo1 (col1) values (12345) returning col1 into :v;

1 row inserted

SQL> print v
v
---------
12345

Это имеет тенденцию быть чище и более управляемым в PL / SQL, чем в ряде отдельных операторов, вызываемых из скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...