【问题标题】:Oracle Procedure compiled | Warning: execution completed with warningOracle 程序编译 |警告:执行完成但有警告
【发布时间】:2018-11-03 19:05:51
【问题描述】:

我在 Oracle 中创建了下面提到的过程。它编译但给出警告说“执行完成并发出警告”

create or replace
PROCEDURE check_upc
  (
  upc_id1  IN VARCHAR,
  upc_id2  IN VARCHAR,
  upc_id3  IN VARCHAR 
  )
IS  
BEGIN
  insert into testing2 SELECT upc_id1,upc_id2 from dual;
END;

但是当我将 SQL 语句更改为

insert into testing2 SELECT upc_id1,upc_id2,upc_id3 from dual;

编译时没有任何警告。

基本上,我应该为 10 种 UPC 组合(此过程中的参数)运行一个长代码(约 100 行),为此我将用我的实际代码替换上述 SQL 代码。但是,这个基本的插入语句失败了。

提前致谢。

【问题讨论】:

  • 您可以查询user_errors 视图以查看实际的编译错误是什么。一些客户端也有一个show errors 命令,它只是为你做的。
  • 请包括您正在使用的工具、表testing2 的定义以及警告的全文。当我使用 2 列 testing2 表对其进行测试时,第一个版本已编译,但 PL/SQL Developer 警告我提示:参数“upc_id3”已声明但从未在“check_upc”中使用。 (虽然这是 PL/SQL Developer 的一个特性,而不是 PL/SQL 编译器消息。您在使用 PL/SQL Developer 吗?)将其更改为无效的 3 列插入失败,使用 ORA-00913 编译:也许多值.

标签: sql oracle stored-procedures compiler-errors procedure


【解决方案1】:

始终列出您用于update 的列:

create or replace procedure check_upc (
  in_upc_id1  IN VARCHAR,
  in_upc_id2  IN VARCHAR,
  in_upc_id3  IN VARCHAR 
) IS  
BEGIN
  insert into testing2 (id1, id2)  -- or whatever the names are
      select in_upc_id1, in_upc_id2
      from dual;
END;

注意事项:

  • 我传统上命名输入参数是为了将它们与局部变量和列名区分开来。
  • VARCHAR 看起来很奇怪。 Oracle 推荐varchar2
  • 使用insert 时,列出列名。

警告本质上是说:“这不适用于当前的表定义。但我接受它,因为您将来可能会更改定义,我真的想通过不拒绝存储来帮助您程序。”

【讨论】:

  • 谢谢。您在插入中列出列名的建议有所帮助。你能帮我下面的SQL代码吗?放入程序时它再次给我同样的警告,而单独运行时它运行良好。插入 test123(store_id,promoweek_id,holiday) select p.store_id,p.promoweek_id,q.holiday from i_eyc_ab_sf_h_stg p left join i_ab_sf_promo_lkp_dim q on p.promoweek_id=q.promoweek_id left join abs_store_cluster_lkp_dim c on p.store_id=c.store_id where lpad(upc_id,13,0)=lpad(in_upc_id0,13,0) and p.promoweek_id >= 201544 and p.promoweek_id
  • 在问题描述中添加了我的代码。请查看并提供帮助。
猜你喜欢
  • 2011-02-12
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多