【问题标题】:Can't bind variables in Oracle procedure无法在 Oracle 过程中绑定变量
【发布时间】:2012-10-18 04:35:19
【问题描述】:

这是我正在尝试运行的程序。它插入两个表 - 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;"

没有参数,查询工作正常。 IE。如果我删除所有:somethings 并对值进行硬编码,那么当我运行exec Insert_Row; 时它运行时不会出现错误

用参数(用:somethings),有错误:

show errors procedure Insert_Row;

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'

非常感谢。

【问题讨论】:

  • 去掉所有参数前面的冒号。所以:somethings 变成了somethings
  • @Nicholas Krasnov 再次感谢。错误消失了,但是您如何调用该程序?我现在在 PHP 中执行此操作:$parse = oci_parse( $conn, $sql ); oci_bind_by_name( $parse, 'summary', $this->summary ); 给出:Warning: oci_bind_by_name(): ORA-01036: illegal variable name/number(其中$sql 是更正后的查询)。
  • 看看thisthis example
  • 好的,我快到了。这是我的程序调用:exec Insert_Action('test','test',1,to_date('2012-01-01','YYYY-MM-DD'),to_date('2012-01-01','YYYY-MM-DD'),1,1,'test','test','test');,这是(希望如此)最终错误:Error starting at line 1 in command: exec Insert_Action('test','test',1,to_date('2012-01-01','YYYY-MM-DD'),to_date('2012-01-01','YYYY-MM-DD'),1,1,'test','test','test') Error report: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 1 06502. 00000 - "PL/SQL: numeric or value error%s" *Cause: *Action:
  • @ale 你的最后一个参数是一个数字,你正在尝试插入一个字符。

标签: php sql oracle stored-procedures oracle11g


【解决方案1】:

试试这个

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;

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

【讨论】:

  • Polppan 请参阅对@Nicholas Krasnov 问题评论的评论。谢谢。
  • @ale 对php不太了解,但是看看thisthis as well
【解决方案2】:

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

【讨论】:

  • @ale 发布您修改后的程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2013-11-22
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多