2016-04-28 4 views
0

Я работаю над хранимой процедурой, которая выбирает некоторые данные из нескольких таблиц. Некоторые из таблиц не совсем готовы к тому, чтобы данные извлекались из них, поэтому я подумал, что могу использовать объединение и передать некоторые параметры хранимой процедуре, где можно получить данные и по существу использовать нуль, пока данные не будут готовы.PL/SQL coalesce on value value

PROCEDURE SP (frst_name VARCHAR2 default null) 
    AS 
    BEGIN 
SELECT 
    coalesce(frst_name, oldTable.frst_name) 
FROM 
    oldTable left join newTable on oldTable.Id = newTable.Id  
END SP; 

Ниже приведена упрощенная версия хранимой процедуры. Есть ли способ заставить это работать?

Когда я пытаюсь скомпилировать хранимую процедуру, я получаю Error (37,4): PL/SQL: SQL Statement игнорируется.

UPDATE

Я забыл упомянуть, я использую псевдонимы в присоединиться ведет меня думать, что этот вопрос может быть на самом деле со вторым параметром Coalesce и не переменной, что я прохожу. Я заметил предупреждение на 2 псевдонимов, говоря «новые» отключен от остальной части графа присоединиться

PROCEDURE SP (frst_name VARCHAR2 default null) 
    AS 
    BEGIN 
SELECT 
    coalesce(frst_name, oldTable.frst_name) 
FROM 
    oldTable old left join newTable new on oldTable.Id = newTable.Id  
END SP; 

Я подтвердил это, переключая переменную frst_name с нулевым и все еще получает ту же ошибку, вы, ребята, есть любая идея, что происходит?

решаемых

Спасибо, ребята, но это была глупая ошибка с моей стороны, я использую другой пользователь базы данных для хранимых процедур, и я не ставил синоним или предоставлять доступ к пользовательскому -_- уроку научился!

+1

Вот и весь стек ошибок? Вы не выбираете * в * ничего, но тогда у вас нет локальной переменной для выбора в примере. Аргументы для вашего 'coalesce' также могут быть неправильным способом, который не будет ошибкой, но может не получить желаемого результата. У вас также есть проблема с областью/приоритетом, если ваши имена переменных и столбцов совпадают. Пока неясно, что вы на самом деле делаете. Иногда вы можете упростить свой код настолько, что скрываете проблему и намерение. –

ответ

0

Ур не используется, и это запрещено в PL SQL. ... также вы можете лучше использовать NVL или декодировать для такого простого теста .... coalesce в основном для селеддинга первого ненулевого значения,

любых способов .. вот правильный синтаксис:

create or replace PROCEDURE sp(frst_name VARCHAR2 default null) 
AS 
v number; 
BEGIN 
SELECT 
coalesce(oldTable.frst_name,frst_name) 
into v 
FROM 
oldTable left join newTable 
on oldTable.ID = newTable.ID; 
END sp; 

также использовать проявитель SQL для более сообщений об ошибках декларативных, это бесплатно!

+2

Это неверно; вы объявили 'v' как число, а не строку, и проблема разрешения имен для неквалифицированного' frst_name'. Это также не совсем ясно из вопроса о том, что замена коалиционных условий является правильной. (И что не так со стандартным объединением? И, пожалуйста, не используйте txt spk в своих сообщениях) –

+0

Я использую coalesce, потому что, если столбец в новой таблице равен нулю, мне все равно хотелось бы извлечь данные из старой таблицы, которые я Знание не равно нулю. Это упрощенная версия фактического хранимого proc, но когда я запускаю select самостоятельно, он работает точно так, как я этого хочу. Я также использую SQL Developer, и это все, что я вижу в журнале компилятора, где-то еще я должен смотреть? – djfried