我可以在存储过程中使用 if 语句将值插入到表中吗?

Posted

技术标签:

【中文标题】我可以在存储过程中使用 if 语句将值插入到表中吗?【英文标题】:Can I use if statements in a stored procedure to insert values into a table? 【发布时间】:2016-04-22 15:43:29 【问题描述】:

我正在尝试编写一个存储过程来选择 indiv_ids 和 transaction_ids 并将它们插入到我的架构上的表中。在这样做时,我想传入变量并让存储过程使用 if 语句根据传入的信息从不同的表中选择 indiv_ids 和 transaction_ids。我尝试了一些变体,但无法让过程工作没有错误。谢谢!

 create or replace procedure myproc (name_type in varchar2, dept in number)
 is begin 
 if name_type='promo' then insert into mytable(indiv_id,transaction_id)
 ---sql here; 
 commit;
 elsif name_type='deal' then insert into mytable(indiv_id, transaction_id)
 ---sql here;
 commit;
 end if;
 end;


 errors: Error(8,10): PL/SQL: SQL Statement ignored, 
         Error(16,31): PL/SQL:  ORA-00942: table or view does not exist

【问题讨论】:

First if 语句丢失 end if @NaughtyNinja 感谢您的评论。我试过单独的 if 语句,它没有改变任何东西。使用当前语法,我会忽略 SQL 语句,并且表或视图不存在错误。如果我分解 if 语句,仍然不会发生 您应该将遇到的错误堆栈添加到问题中。如果您在评论中收到错误,则 mytable 或您查询的表之一不存在;或者您无权从程序中访问它。您是否拥有所涉及的所有表,或者是否在其他模式中(通过同义词或通过设置 current_schema 或使用模式限定名称访问)? @AlexPoole 错误(28,12):PL/SQL:SQL 语句被忽略错误(36,31):PL/SQL:ORA-00942:表或视图不存在。我得到的错误。我最初以为是关于权限的,但我使用我不拥有的表创建了一个简单的测试过程,并且确实能够创建该过程。 请将错误堆栈添加到问题中。也许你只是拼错了一个表名。您使用另一个程序检查权限,而不是匿名块?我们看不到您的架构、权限或查询,因此无法为您缩小范围。不过,这与 if 构造无关。 【参考方案1】:

注意name_type变量被声明为NUMBER,但在过程体中它与字符串进行比较:

if name_type='promo' then

这不是 ORA-00942 错误的原因,但无论如何它会使您的程序无法正常工作。

【讨论】:

抱歉,在我当前的查询中是 varchar2。

以上是关于我可以在存储过程中使用 if 语句将值插入到表中吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 中将结果集插入到表中

在 Oracle 中,我可以执行“将值插入或更新到表中”吗

避免雪花中存储过程的重复

使用 select 语句在表中插入

使用雪花中的存储过程将值插入表中

使用/动态名称调用表的 MySQL 存储过程