我想我可能在这里遗漏了一些东西。这是触发器的相关部分:

CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
/* Removed for brevity */
OPEN columnNames('TEMP');

这是我返回的错误消息,

27/20   PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES'
27/2    PL/SQL: Statement ignored

如果我正确理解文档,那应该可行,但既然不是,我一定做错了什么。有任何想法吗?


@马修 - 我很感谢您的帮助,但我感到困惑的原因是因为这段代码对我不起作用并且引发了引用的错误。我们在数据库中有其他触发器,其代码几乎与此完全相同,因此我不确定是否是我做错了什么,或者是我尝试存储触发器的方式等。


@马修 - 好吧,现在我感到尴尬了。我将您提供的代码复制/粘贴到新触发器中,效果很好。所以我回到原来的触发器并尝试它并再次收到错误消息,除了这次我开始从触发器中删除内容并在删除此行后,

FOR columnName IN columnNames LOOP

事情保存得很好。所以事实证明,我认为错误所在的地方,实际上并不是错误所在。

有帮助吗?

解决方案

@抢

如果您剪切/粘贴我在这里的代码,它可以工作吗?

你如何/在哪里调用你的代码?它在触发器中是吗?

您在此处编写的查询实际上是产生错误的代码,或者只是一个示例(例如,您可以使用上面的查询重现错误吗)

其他提示

为了弄清楚问题的原因。正如你所说

OPEN 列名('TEMP');

工作时

FOR 列名称 IN 列名称 LOOP

没有。如果 FOR 语句还包含如下参数,则它可以正常工作:

FOR 列名称 IN 列名称('TEMP') LOOP

您没有显示获取行的代码,所以我无法告诉您的目的,但是我工作的地方 OPEN 通常用于获取第一行(在本例中,是给定表的第一列名称),而FOR 用于迭代所有返回的行。

@Rob 的评论。我不被允许发表评论,所以在这里更新。缺少的参数就是我上面描述的。您添加了一条响应,指出您只是删除了 FOR 循环。当时你看起来并不明白为什么删除它会产生影响。这就是为什么我试图解释,因为根据您的需要,FOR 循环可能是更好的解决方案。

对我来说效果很好。

create or replace procedure so_test_procedure as 
 CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN      
 OPEN columnNames('TEMP');
 CLOSE columnNames;
END;

procedure so_test_procedure Compiled.
execute so_test_procedure();

anonymous block completed
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top