错误(30,11):PLS-00103:遇到符号更新错误

Posted

技术标签:

【中文标题】错误(30,11):PLS-00103:遇到符号更新错误【英文标题】:Error(30,11): PLS-00103: Encountered the symbol UPDATE error 【发布时间】:2017-04-12 13:45:32 【问题描述】:

在 SP 下创建时,我收到错误

错误(30,11):PLS-00103:在预期以下情况之一时遇到符号“UPDATE”:(-+ case mod new not null select with continue avg count current exists max min prior sql stddev sum variance execute forall 合并时间时间戳间隔日期管道

这是我的 SP

Procedure Update_Link_Details (
 P_UDLINKID NVARCHAR2,
 P_FOLDERSTRUCTURE NVARCHAR2,
 TBL_UPD OUT SYS_REFCURSOR        
)
 AS
 BEGIN
    OPEN TBL_UPD FOR 
         Update Tb_Link_Print 
          set status='Start' 
          where LINKPRINTID= P_UDLINKID 
          and upper(FOLDERSTRUCTURE) LIKE '%' || upper(P_FOLDERSTRUCTURE) || %';    
  NULL;
END Update_Link_Details;

【问题讨论】:

您是要查询数据还是更改数据?您的光标应该是 SELECT,而不是更新。或者,它不应该是一个光标。 是哪一个;甲骨文还是 mysql @thatjeffsmith:我只想用那个状态更新表格,我不想选择或类似的东西 您在最后一个 % 周围缺少一个单引号,您应该查看 RETURNING INTO 子句,看看它是否涵盖了您想要返回的内容。 @BriteSponge - 不要告诉 Jeff 你使用 TOAD :) 【参考方案1】:

“我只想更新具有该状态的表......我还想返回更新后的记录”

这是两件事,所以是两个陈述:

Procedure Update_Link_Details (
 P_UDLINKID NVARCHAR2,
 P_FOLDERSTRUCTURE NVARCHAR2,
 TBL_UPD OUT SYS_REFCURSOR        
)
 AS
 BEGIN
     Update Tb_Link_Print 
      set status='Start' 
      where LINKPRINTID= P_UDLINKID 
      and upper(FOLDERSTRUCTURE) LIKE '%' || upper(P_FOLDERSTRUCTURE) || '%';    
  OPEN TBL_UPD FOR 
   select * from  Tb_Link_Print 
   where LINKPRINTID= P_UDLINKID 
      and upper(FOLDERSTRUCTURE) LIKE '%' || upper(P_FOLDERSTRUCTURE) || '%';    
END Update_Link_Details;

这有点笨拙。这是一个工程师消除重复的版本:

Procedure Update_Link_Details (
 P_UDLINKID NVARCHAR2,
 P_FOLDERSTRUCTURE NVARCHAR2,
 TBL_UPD OUT SYS_REFCURSOR        
)
 AS
      upd_rowids sys.dbms_debug.vc2coll;
 BEGIN
     Update Tb_Link_Print 
      set status='Start' 
      where LINKPRINTID= P_UDLINKID 
      and upper(FOLDERSTRUCTURE) LIKE '%' || upper(P_FOLDERSTRUCTURE) || '%'
      returning rowidtochar(rowid) bulk collect into upd_rowids;    

  OPEN TBL_UPD FOR 
   select p.* 
   from  Tb_Link_Print p
   join table(upd_rowids) u
      on p.rowid = chartorowid(u.column_value) 
   ;    
END Update_Link_Details;

它使用 RETURNING 子句捕获受影响行的 ROWID,然后使用这些 ROWID 打开 Ref Cursor 以限制结果集。

【讨论】:

以上是关于错误(30,11):PLS-00103:遇到符号更新错误的主要内容,如果未能解决你的问题,请参考以下文章

错误 PLS-00103:遇到符号“DECLARE”?

PLS-00103 遇到符号“数字”

错误:PLS-00103:在预期以下情况之一时遇到符号“)”

PL/SQL 函数错误 - PLS-00103:遇到符号“IS”

PLS-00103 在 CASE 中遇到符号“”错误 [关闭]

PLS-00103:遇到符号“/”