Php Can';Oracle过程中的t绑定变量

Php Can';Oracle过程中的t绑定变量,php,sql,oracle,stored-procedures,oracle11g,Php,Sql,Oracle,Stored Procedures,Oracle11g,这是我正在尝试运行的一个过程。它插入到两个表中—table1和一个关联表table2 create or replace procedure Insert_Row (summary IN VARCHAR2 description IN VARCHAR2, status IN NUMBER, date_submitted IN DATE, last_updated IN DATE, owner_id IN NUMBER, reporter_id IN NUMBER, fo

这是我正在尝试运行的一个过程。它插入到两个表中—
table1
和一个关联表
table2

create or replace procedure Insert_Row (summary IN VARCHAR2
   description IN VARCHAR2, status IN NUMBER, 
   date_submitted IN DATE, last_updated IN DATE,
   owner_id IN NUMBER, reporter_id IN NUMBER,
   foo IN VARCHAR2, bar IN VARCHAR2,
   first_assignee IN NUMBER) 
is
   l_cur_id number;
begin
   insert into table1 
      (summary, description, status, date_submitted, 
       last_updated, owner_id, reporter_id, 
       foo, bar)
    values( :summary, :description, :status, 
            to_date(:date_submitted,'YYYY-MM-DD'), 
            to_date(:last_updated,'YYYY-MM-DD'), :owner_id, 
            :reporter_id, :foo, :bar)
            returning action_id into l_cur_id; 
    insert into table2(action_id, assignee_id) 
    values(l_cur_id,:test);
    commit;
 end;"
如果没有参数,查询工作正常。也就是说,如果我删除了所有的
:somethings
并对值进行了硬编码,那么当我运行
exec Insert\u行时,它运行时不会出错

Errors: check compiler log
2/4            PLS-00103: Encountered the symbol "DESCRIPTION" when expecting one of the following:

   := . ) , @ % default character
The symbol "," was substituted for "DESCRIPTION" to continue.

14/13          PLS-00049: bad bind variable 'SUMMARY'
14/23          PLS-00049: bad bind variable 'DESCRIPTION'
14/37          PLS-00049: bad bind variable 'STATUS'
15/21          PLS-00049: bad bind variable 'DATE_SUBMITTED'
16/21          PLS-00049: bad bind variable 'LAST_UPDATED'
16/50          PLS-00049: bad bind variable 'OWNER_ID'
17/13          PLS-00049: bad bind variable 'REPORTER_ID'
17/27          PLS-00049: bad bind variable 'FOO'
17/33          PLS-00049: bad bind variable 'BAR'
20/21          PLS-00049: bad bind variable 'TEST'
对于参数(使用
:somethings
),存在以下错误:

显示错误过程插入\u行

Errors: check compiler log
2/4            PLS-00103: Encountered the symbol "DESCRIPTION" when expecting one of the following:

   := . ) , @ % default character
The symbol "," was substituted for "DESCRIPTION" to continue.

14/13          PLS-00049: bad bind variable 'SUMMARY'
14/23          PLS-00049: bad bind variable 'DESCRIPTION'
14/37          PLS-00049: bad bind variable 'STATUS'
15/21          PLS-00049: bad bind variable 'DATE_SUBMITTED'
16/21          PLS-00049: bad bind variable 'LAST_UPDATED'
16/50          PLS-00049: bad bind variable 'OWNER_ID'
17/13          PLS-00049: bad bind variable 'REPORTER_ID'
17/27          PLS-00049: bad bind variable 'FOO'
17/33          PLS-00049: bad bind variable 'BAR'
20/21          PLS-00049: bad bind variable 'TEST'
我做错了什么

编辑

@ron tornambe解决方案后的查询是:

create or replace procedure Insert_Row (summary IN VARCHAR2,
   description IN VARCHAR2, status IN NUMBER, 
   date_submitted IN DATE, last_updated IN DATE,
   owner_id IN NUMBER, reporter_id IN NUMBER,
   foo IN VARCHAR2, bar IN VARCHAR2,
   first_assignee IN NUMBER) 
is
   l_cur_id number;
begin
   insert into table1 
      (summary, description, status, date_submitted, 
       last_updated, owner_id, reporter_id, 
       foo, bar)
    values( :summary, :description, :status, 
            to_date(:date_submitted,'YYYY-MM-DD'), 
            to_date(:last_updated,'YYYY-MM-DD'), :owner_id, 
            :reporter_id, :foo, :bar)
            returning action_id into l_cur_id; 
    insert into table2(action_id, assignee_id) 
    values(l_cur_id,:test);
    commit;
 end;"
此修改后的错误为:

14/13          PLS-00049: bad bind variable 'SUMMARY'
14/23          PLS-00049: bad bind variable 'DESCRIPTION'
14/37          PLS-00049: bad bind variable 'STATUS'
15/21          PLS-00049: bad bind variable 'DATE_SUBMITTED'
16/21          PLS-00049: bad bind variable 'LAST_UPDATED'
16/50          PLS-00049: bad bind variable 'OWNER_ID'
17/13          PLS-00049: bad bind variable 'REPORTER_ID'
17/27          PLS-00049: bad bind variable 'FOO'
17/33          PLS-00049: bad bind variable 'BAR'
20/21          PLS-00049: bad bind variable 'TEST'

非常感谢。

您只需在“VARCHAR2中的摘要”后面加一个逗号即可。此外,关键字“IN”是默认值。7

您只需在“VARCHAR2中的摘要”后面加一个逗号即可。此外,关键字“IN”是默认值。7

create or replace procedure Insert_Row (summary IN VARCHAR2,
   description IN VARCHAR2, status IN NUMBER, 
   date_submitted IN DATE, last_updated IN DATE,
   owner_id IN NUMBER, reporter_id IN NUMBER,
   foo IN VARCHAR2, bar IN VARCHAR2,
   first_assignee IN NUMBER) 
is
   l_cur_id number;
begin
   insert into table1 
      (summary, description, status, date_submitted, 
       last_updated, owner_id, reporter_id, 
       foo, bar)
    values( summary, description, status, 
            to_date(date_submitted,'YYYY-MM-DD'), 
            to_date(last_updated,'YYYY-MM-DD'), owner_id, 
            reporter_id, foo, bar)
            returning action_id into l_cur_id; 
    insert into table2(action_id, assignee_id) 
    values(l_cur_id,test);
    commit;
 end;
如果要传递参数,则不需要冒号,可以直接指定参数名称。另一点是,如果您是从客户端或前端调用此过程,最好从过程中删除commit,并使用调用客户端的commit。

试试这个方法

create or replace procedure Insert_Row (summary IN VARCHAR2,
   description IN VARCHAR2, status IN NUMBER, 
   date_submitted IN DATE, last_updated IN DATE,
   owner_id IN NUMBER, reporter_id IN NUMBER,
   foo IN VARCHAR2, bar IN VARCHAR2,
   first_assignee IN NUMBER) 
is
   l_cur_id number;
begin
   insert into table1 
      (summary, description, status, date_submitted, 
       last_updated, owner_id, reporter_id, 
       foo, bar)
    values( summary, description, status, 
            to_date(date_submitted,'YYYY-MM-DD'), 
            to_date(last_updated,'YYYY-MM-DD'), owner_id, 
            reporter_id, foo, bar)
            returning action_id into l_cur_id; 
    insert into table2(action_id, assignee_id) 
    values(l_cur_id,test);
    commit;
 end;

如果要传递参数,则不需要冒号,可以直接指定参数名称。另一点是,如果您是从客户端或前端调用此过程,最好从过程中删除commit,并使用调用客户端的commit。

@ale Postprocedure@ale发布修改后的过程在所有参数前删除冒号。所以
:somethings
变成
somethings
@Nicholas Krasnov再次感谢。错误消失了,但如何调用该过程?我现在正在用PHP做这件事:
$parse=oci\u parse($conn,$sql);oci_按名称绑定($parse,'summary',$this->summary)给出:
警告:oci_bind_by_name():ORA-01036:非法变量名称/编号
(其中,
$sql
是正确的查询)。请看一看或看一看好的,我就快到了。这是我的过程调用:
exec Insert_Action('test','test',1,to_date('2012-01-01','YYYY-MM-DD'),to_date('2012-01-01','yyyyy-MM-DD'),1,1,'test','test和'test')这是(希望)最后的错误:
从命令第1行开始的错误:exec Insert_Action('test','test',1,to_date('2012-01-01','yyyyy-MM-DD'),to_date('2012-01-01','yyyyyy-MM-DD'),1,1,'test,'test','test错误报告:ORA-06502:PL/SQL:数字或值错误:字符到数字的转换错误ORA-06512:第106502行。00000-“PL/SQL:数值或值错误%s”*原因:*操作:
@ale您的最后一个参数是一个数字,您正在尝试插入一个字符。请删除所有参数前面的冒号。所以
:somethings
变成
somethings
@Nicholas Krasnov再次感谢。错误消失了,但如何调用该过程?我现在正在用PHP做这件事:
$parse=oci\u parse($conn,$sql);oci_按名称绑定($parse,'summary',$this->summary)给出:
警告:oci_bind_by_name():ORA-01036:非法变量名称/编号
(其中,
$sql
是正确的查询)。请看一看或看一看好的,我就快到了。这是我的过程调用:
exec Insert_Action('test','test',1,to_date('2012-01-01','YYYY-MM-DD'),to_date('2012-01-01','yyyyy-MM-DD'),1,1,'test','test和'test')这是(希望)最后的错误:
从命令第1行开始的错误:exec Insert_Action('test','test',1,to_date('2012-01-01','yyyyy-MM-DD'),to_date('2012-01-01','yyyyyy-MM-DD'),1,1,'test,'test','test错误报告:ORA-06502:PL/SQL:数字或值错误:字符到数字的转换错误ORA-06512:第106502行。00000-“PL/SQL:数值或值错误%s”*原因:*操作:
@ale您的最后一个参数是一个数字,您正在尝试插入一个字符。Polppan请参阅对@Nicholas Krasnov的问题评论的评论。谢谢。@ale对php了解不多,但请看一看,波尔潘请看对@Nicholas Krasnov的问题评论的评论。谢谢。@ale对php了解不多,但请看一下和