2013-05-06 6 views
2

Я создал процедуру следующимкак вызвать процедуру PLSQL

create or replace procedure "GETCUSTNAMEZZz" 
(cust_identifier1 IN NVARCHAR2(10)) 
is 
begin 
DBMS_OUTPUT.PUT_LINE (FNAME || ' ' || LNAME FROM customer WHERE cust_id=cust_identifier1) 
end; 

Я тогда попробуйте вызова процедуры

BEGIN 

GETCUSTNAMEZZz('C2') ; 


END; 

Это SQL дает мне ошибку, что идентификатор «GETCUSTNAMEZZZ» должен быть объявлен ORA -06550: строка 3, столбец 5: PL/SQL: заявление игнорируется «

Это точная процедура, которую я создал, и параметр правильный.

Как именно я объявляю идентификатор?

Заранее спасибо.

+0

Вы должны иметь возможность вызвать его, как показано на рисунке, но не забудьте ввести 'SET SERVEROUTPUT ON SIZE 1000' (или любого другого размера) перед выполнением. Проблема в том, что ваш proc не существует, потому что он не компилируется.Я вижу ряд проблем: (1) используйте 'NVARCHAR2' вместо' NVARCHAR2 (10) 'для параметра, (2) вам нужно запросить' FNAME' и 'LNAME' в переменные, прежде чем вы сможете их показать (3) строка кода, начинающаяся с 'DBMS_OUTPUT.PUT_LINE', должна содержать точку с запятой в конце. Если вы создаете proc и получаете «созданный с ошибками», введите «показать ошибки», чтобы увидеть ошибки. –

+0

Если у меня это правильно, даже если оракул говорит, что созданная процедура не может скомпилироваться при вызове ?? –

+0

Правильно - если он был создан с ошибками, Oracle все равно позволит вам его вызвать; он будет перекомпилировать, но перекомпиляция в вашем случае не удастся. См. Ответ @DaveCosta ниже. У вашей проблемы все еще есть проблемы, но вы можете сэкономить массу горя, не используя двойные кавычки - они уже отправлены вам на дорогостоящую поездку. –

ответ

2

Эта процедура не компилируется. Поэтому вы не можете это назвать. Также вы должны добавить SET SERVEROUTPUT ON, иначе вы не увидите DBMS_OUTPUT.PUT_LINE.

Вы бы SELECT то, что вы хотите отобразить INTO другая переменная. Тогда вы можете потерпеть неудачу, если у вас есть несколько результатов. Так лучше использовать курсор.

create or replace procedure GETCUSTNAMEZZz 
(cust_identifier1 IN NVARCHAR2(10)) 
is 
begin 
    for c in (SELECT FNAME || ' ' || LNAME as flname FROM customer WHERE cust_id=cust_identifier1) 
    loop 
    DBMS_OUTPUT.PUT_LINE (c.flname); 
    end loop; 
end getcustnamezzz; 

Затем вы можете запустить его с

set serverouput on 
BEGIN 
    GETCUSTNAMEZZz('C2') ; 
END; 

Edit: Стоит отметить, что Дэйв Коста отметил, что котировки на самом деле сделать случай имя процедуры чувствительным, но Oracle обычно автоматически преобразует все прописные и именно поэтому это тоже не сработало.

+0

Oracle 11g. Создание процедур было абсолютным ночным кошмаром. Функции, триггеры, соединения и т. Д. Все в порядке, но я был здесь в течение 6 часов, пытаясь получить базовую процедуру для работы. «Ошибка в строке 5: PLS-00103: встречается символ«) »при ожидании одного из следующих:. (* @% & - + ;/at mod остаток назад возврат возвращается <экспонента (**)> и или || мультисеть 0.08 второй "появляется при вводе этого кода. –

+0

Подумайте, что вы забыли его' select' в курсоре 8). Надеемся, что идентификатор клиента будет уникальным, но если он не может быть, то курсор может быть полезен, и все равно хорошо знать. Также параметр не должен иметь '(10)', вы не можете ограничить размер переданной строки, как это. –

+0

Спасибо за это. Я сделаю редактирование. – hol

8

Причиной ошибки объявления «идентификатор» является чувствительность к регистру.

Идентификаторы Oracle, как правило, автоматически преобразуются во все верхние регистры, но когда вы заключите их в двойные кавычки, регистр сохраняется. Так что это:

create or replace procedure "GETCUSTNAMEZZz" 

создает процедуру с точным названием «GETCUSTNAMEZZz», в то время как это:

create or replace procedure GETCUSTNAMEZZz 

бы создать процедуру с точным названием «GETCUSTNAMEZZZ» (в верхнем регистре).

Вы не используете кавычки, когда вы вызываете процедуру. Поэтому он ищет «GETCUSTNAMEZZZ», которого нет, потому что вы создали его как «GETCUSTNAMEZZz».

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

(Обратите внимание, что речь идет о идентификаторах не строковые значения. При сравнении строковых значений (например, «Это строка») и/или переменные (например, переменная типа VARCHAR2), дело всегда имеет значение.)

+1

Это был долгий день. Поверь мне, я больше никогда не вернусь к двойным кавычкам :) –

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