0

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

    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:调用“COLUMNNAMES”时参数的数量或类型错误
27/2 PL/SQL:语句被忽略

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


@ Matthew - 我很感激你的帮助,但我感到困惑的原因是这段代码对我不起作用并且引发了引用的错误。我们在数据库中有其他触发器的代码几乎完全一样,所以我不确定这是我做错了什么,还是我试图存储触发器的方式等等。


@Matthew -好吧,现在我感到很尴尬。我将您提供的代码复制/粘贴到新触发器中,效果很好。所以我回到原来的触发器并尝试它并再次收到错误消息,除了这次我开始从触发器中删除东西并且在摆脱这条线之后,

FOR columnName IN columnNames LOOP

东西保存得很好。所以事实证明,我认为错误在哪里,实际上并不是错误在哪里。

4

2 回答 2

2

澄清问题的原因。正如你所说

打开 columnNames('TEMP');

工作时

FOR columnName IN columnNames 循环

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

FOR columnName IN columnNames('TEMP') 循环

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

@Rob 的评论。我不允许发表评论,所以在这里更新。缺少的参数就是我上面描述的。您添加了一条回复,说明您只是删除了 FOR 循环。当时,您似乎不明白为什么删除它会有所作为。这就是我试图解释的原因,因为根据您的需要,FOR 循环可能是更好的解决方案。

于 2008-09-16T22:10:22.757 回答
1

对我来说很好。

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
于 2008-09-04T14:22:55.993 回答