2013-03-19 5 views
0

У меня есть процедура, которая вставляет строку в одну из моих таблиц.Вызвать хранимую процедуру в другую хранимую процедуру

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

Так что у меня все первую процедуру, которая работает отлично

P_INSERT_TABLE1 

INSERT INTO TABLE1 

... 
COMMIT; 

FOR record_po IN (SELECT C3, ... 
        FROM T_TABLE2 
        WHERE id = v_id) 
LOOP 
     P_INSERT_TABLE2(record_po.C3, ...); 
END LOOP; 

все «в параметрах» для P_INSERT_TABLE2 являются VARCHAR2, поэтому я сделать «to_char» для каждого столбца не varchar2:

P_INSERT_TABLE2(pi_id, 
         record_po.C3, 
         record_po.C4, 
         record_po.C5, 
         record_po.C6, 
         record_po.C7, 
         to_char(record_po.C8, 'DD/MM/YYYY'); 

Здесь pi_id является одним из параметров P_INSERT_TABLE1 в VARCHAR2.

Так что теперь у меня есть сообщение об ошибке:

Erreur(357,1): PLS-00306: number or args types wrong in the call of P_INSERT_TABLE2 

Я не понимаю, почему P_INSERT_TABLE2 не принимают параметры, в то время как есть все хорошие типы в порядке?

Если я вызываю процедуру, как «call P_INSERT_TABLE2(...)» У меня есть ошибка, как:

Erreur(357,9): PLS-00103: Symbol "P_INSERT_TABLE2" instead one of this symbols :  := . (@ % ; immediate Symbole ":=" 

create or replace 
PROCEDURE P_INSERT_TABLE2 (
    pi_id   IN VARCHAR2 
    ,pi_C3   IN VARCHAR2 
    ,pi_C4   IN VARCHAR2 
    ,pi_C5   IN VARCHAR2 
    ,pi_C6   IN VARCHAR2 
    ,pi_C7   IN VARCHAR2 
    ,pi_C8   IN VARCHAR2 
    ,pmessage  OUT NOCOPY VARCHAR2 
) 

Спасибо за помощь.

+0

Не могли бы вы добавить декларацию для P-INSERT-TABLE2, пожалуйста? BTW: Пожалуйста, не используйте «-» в именах процедур - это ужасно запутанно; Я не считаю, что это ваш настоящий код, поскольку имена таблиц и имена процедур, содержащие «-», не будут приняты Oracle, если они не будут правильно указаны. –

+0

Да, код слишком длинный, поэтому я заменяю имя colum на C1 и т. Д. ... И имя таблицы и процедуру с родовыми именами. –

+2

Как насчет вашего параметра OUT? Вы отправляете это, когда звоните из P_INSERT_TABLE1? –

ответ

3

Объявление P_INSERT_TABLE2 недействительно. У вас не может быть 5 входных параметров с именем pi_C4. Поскольку вы не получаете ошибку компиляции, создающую эту процедуру, я предполагаю, что это была ошибка, которая была введена, размещая здесь вопрос, а не то, что на самом деле находится в коде.

Согласно заявлению P_INSERT_TABLE2, процедура принимает 7 входных параметров и один выходной параметр. В коде, который вы отправили, вы, кажется, передаете 7 входных параметров, но вы не передаете переменную для выходного параметра. Оказывается, что вам нужно что-то вроде

P_INSERT_TABLE2(pi_id, 
       record_po.C3, 
       record_po.C4, 
       record_po.C5, 
       record_po.C6, 
       record_po.C7, 
       to_char(record_po.C8, 'DD/MM/YYYY'), 
       <<some local variable for the output parameter>>); 

Beyond ошибок синтаксиса, я весьма сомнителен, когда я вижу, кто-то принимает совершенно хороший DATE, отбрасывая его в строку, а затем передать, что к процедуре. Это означает, что P_INSERT_TABLE2 собирается обернуться и преобразовать строку обратно в дату, что означает, что вы выполняете дополнительную работу и ввели дополнительные точки, в которых могут произойти конверсии, или что вы собираетесь написать строковое представление дата в таблицу. Ни одно из этих последствий не является хорошим.

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

+0

Действительно, я конвертирую строку назад, но это потому, что мне нужно P_INSERT_TABLE2 в других случаях. Поэтому я должен это сделать. И я использую исключение, но pmessage может быть хорошим или неправильным, поэтому я показываю его в своем представлении silverlight (сообщение succes или сообщение об ошибке). Вот почему я использую параметры OUT и Exception. –

+0

Спасибо, что сейчас отлично. Я думал, что мне не нужно иметь параметр OUT в вызове. Теперь я это узнаю. –