更新语句在正常模式下工作,但不在过程中

Posted

技术标签:

【中文标题】更新语句在正常模式下工作,但不在过程中【英文标题】:Update statement works in normal mode, but not in procedure 【发布时间】:2016-03-24 04:42:38 【问题描述】:

我想将图像从目录上传到数据库 blob 字段。出于这些原因,我编写了这段代码。单独的代码运行良好,但不能作为一个程序运行。 问题是什么 ?我无法理解。这是代码:

DECLARE
  dest_loc  BLOB;
  src_loc   BFILE;
BEGIN 
  src_loc:= BFILENAME('ALL_IMG_DIR','SDFGASDF1544.jpg');
  DBMS_LOB.FILEOPEN(src_loc);
  DBMS_LOB.CREATETEMPORARY(dest_loc,true);
  DBMS_LOB.LOADFROMFILE(dest_lob => dest_loc, src_lob  => src_loc,amount=>dbms_lob.getlength(src_loc) );

  UPDATE STUDENT     
    SET  IMAGE=dest_loc     
  WHERE 
    REG_CODE = 'SDFGASDF1544';        
    DBMS_LOB.CLOSE(src_loc);     
end;

但是当我把这段代码写成一个过程时,就像

CREATE OR REPLACE PROCEDURE img_to_blob_student(Vreg_code varchar2)
is
  dest_loc  BLOB;
  src_loc   BFILE;
BEGIN            
  src_loc   := BFILENAME('ALL_IMG_DIR','SDFGASDF1544.jpg');      
  DBMS_LOB.FILEOPEN(src_loc);    
  DBMS_LOB.CREATETEMPORARY(dest_loc,true);    
  DBMS_LOB.LOADFROMFILE(
    dest_lob => dest_loc, 
    src_lob  => src_loc,
    amount=>dbms_lob.getlength(src_loc) 
  );
  UPDATE STUDENT 
  SET  IMAGE=dest_loc     
  WHERE REG_CODE = 'SDFGASDF1544';        
  DBMS_LOB.CLOSE(src_loc);          
end;

然后打电话

img_to_blob_student('123');

我明白了

ERROR IS: `ORA-00900: invalid SQL statement in procedure` 

【问题讨论】:

【参考方案1】:

要调用该过程,您是否使用了execstatement?

exec img_to_blob_student('123');

【讨论】:

一个问题先生,我可以动态使用表名和列名吗? 嗨,Arif,你当然可以,但这需要你更多地研究 Oracle ALL TABLESEXECUTE IMMEDIATE * your constructed statement * 。这应该在 *** 中被广泛解释......例如here 创建、删除和更新在 EXECUTE IMMEDIATE 中工作,但我如何在这里使用 SELECT。 你也可以选择一些东西到一个变量中。但这是一个完整的主题,我们不应该试图在这个问题的cmets中讨论它。

以上是关于更新语句在正常模式下工作,但不在过程中的主要内容,如果未能解决你的问题,请参考以下文章

CAN 1 RX 在环回模式下工作,但不在正常模式下

Webservice 在调试模式下工作,但不在发布模式下

除插入语句外,存储过程工作正常

自更新以来,Laravel mix 不会在生产模式下构建

Oracle:更新列,如果它不在 Merge 语句的条件下

Java.SQL 错误:Prepared Statement 不在批处理模式下