2016-03-16 2 views
0

У меня есть проблема с этим кодом в Oracle:ошибка при вызове хранимой процедуры из PHP

create or replace procedure InsertarEntertNotica (IDSUBTOPIC out varchar, 
    TEXT out varchar,IMAGE out varchar,STADE out varchar,TITT out varchar) 
is 
    idS varchar2(3) := IDSUBTOPIC; 
    txt varchar2(4000) := TEXT; 
    img varchar2(100) := IMAGE; 
    st varchar2(2) := STADE; 
    fech varchar2(30); 
    tit varchar2(300) := TITT; 
    hor date; 
begin 
    SELECT TO_CHAR(SYSDATE,'DD/MM/YY') into fech FROM DUAL; 
    SELECT SYSDATE into hor FROM DUAL; 
    insert into ENTERTAIMENT (IDSUBTEMA,TEXTO,IMAGEN,ESTADO,FECHA,TITULO,HORA) 
    values (idS,txt,img,st,fech,tit,hor); 
end; 

Когда я создаю этот SP, я не проблема, но когда я исполню ее у меня проблема

Error starting at line : 377 in command - 
execute InsertarEntertNotica('ET','Texto de la Noticia Proc','','No','Noticia con Procedimiento') 
Error report - 
ORA-06550: line 1, column 28: 
PLS-00363: expression 'ET' cannot be used as an assignment target 
ORA-06550: line 1, column 33: 
PLS-00363: expression 'Texto de la Noticia Proc' cannot be used as an assignment target 
ORA-06550: line 1, column 60: 
PLS-00363: expression '<null>' cannot be used as an assignment target 
ORA-06550: line 1, column 63: 
PLS-00363: expression 'No' cannot be used as an assignment target 
ORA-06550: line 1, column 68: 
PLS-00363: expression 'Noticia con Procedimiento' cannot be used as an assignment target 
ORA-06550: line 1, column 7: 
+0

Ошибка указана в строке 377, но вы не указали 377 строк кода. Также я нахожу, что вы используете VARCHAR в качестве параметров, которые вы сразу переопределяете, поскольку VARCHAR2 внутри процедуры является нечетным. – kevinsky

+1

Почему вы объявили параметры как OUT, когда вы, похоже, собираетесь передавать и использовать значения, а не устанавливать и возвращать их вызывающему? И почему локальные переменные просто принимают значения параметров? Вам действительно нужно сделать это с помощью процедуры вообще? –

ответ

0

Вы указали все свои формальные параметры как OUT, что означает, что при вызове процедуры вы должны передать обновляемые переменные, а не фиксированные строковые значения. The documentation shows how IN/OUT works.

Вы можете просто изменить их на IN. Вам также не нужно какой-либо из локальных переменных:

create or replace procedure InsertarEntertNotica (IDSUBTOPIC in varchar, 
    TEXT in varchar,IMAGE in varchar,STADE in varchar,TITT in varchar) 
is 
begin 
    insert into ENTERTAIMENT (IDSUBTEMA, TEXTO, IMAGEN, ESTADO, FECHA, TITULO, HORA) 
    values (IDSUBTOPIC, TEXT, IMAGE, STADE, TO_CHAR(SYSDATE,'DD/MM/YY'), 
    TITT, SYSDATE); 
end; 

Если вы собираетесь иметь локальные переменные затем имена, которые отличают от имен параметров будет хорошо. Обычно используется префикс для различения, например. p_text для параметра и l_text для локальной переменной.

Использование TO_CHAR(SYSDATE,'DD/MM/YY') выглядит неправильно по нескольким причинам. Двухзначные годы могут вызвать неожиданные результаты, а также печально известные проблемы Y2K. Если FECHA - это столбец DATE, а не VARCHAR2 (8), как и должно быть, то вы неявно конвертируете эту строку обратно в дату, используя настройки сеанса NLS, что является опасным, и будет работать только на всех, если произойдет сеанс , а также DD/MM/YY. Если вы действительно пытаетесь сохранить сегодняшнюю дату со временем как полночь, вместо этого вы должны использовать TRUNC(SYSDATE). Хотя не уверен, почему вы сохранили это как отдельный столбец до HORA в любом случае.

+0

Ха, спасибо @ user272735, полный отказ мозга * 8-) –

+0

Большое вам спасибо, я узнал – Anthony

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