【问题标题】:PLS-00306 (wrong number or types of arguments) on call to cursor [closed]PLS-00306(错误的参数数量或类型)调用游标[关闭]
【发布时间】:2010-09-07 19:32:31
【问题描述】:

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

    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

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

【问题讨论】:

  • 我投票决定关闭,因为不再可重现。下次请选择一个有效的理由,因为这有助于在审核队列中了解您认为应该关闭此问题的原因。

标签: oracle plsql triggers database-cursor


【解决方案1】:

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

打开 columnNames('TEMP');

工作时

FOR columnName IN columnNames LOOP

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

FOR columnName IN columnNames('TEMP') LOOP

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

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

【讨论】:

  • Frode - 我收到错误的原因是因为我试图在未提供参数的情况下调用 FOR LOOP 中的参数化查询。
【解决方案2】:

对我来说很好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2014-10-01
    相关资源
    最近更新 更多