调用光标时出现PLS-00306错误

时间:2008-09-04 14:11:26

标签: oracle plsql triggers cursor

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

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

如果我正确理解文档,那应该有用,但既然不是,我必须做错事。有什么想法吗?


@ Matthew - 我很感激帮助,但我感到困惑的原因是因为这段代码对我不起作用并引发了引用的错误。我们在数据库中有其他触发器,其代码几乎完全相同,所以我不确定它是否是我做错了什么,或者是我试图存储触发器的东西等等。


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

FOR columnName IN columnNames LOOP

事情好转。事实证明,我认为错误在哪里,实际上并不是错误。

3 个答案:

答案 0 :(得分:1)

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

OPEN columnNames('TEMP');

工作时

FOR columnName IN columnNames LOOP

没有。如果FOR语句还包含如下参数:

,则FOR语句可以正常工作

FOR columnName IN columnNames('TEMP')LOOP

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

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

答案 1 :(得分:0)

对我来说很好。

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

答案 2 :(得分:0)

@Rob

如果您剪切/粘贴我在这里的代码,它是否有效?

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

你在这里写的查询,实际上是产生错误的代码,或者只是一个例子(例如,你可以用你上面的查询重现错误)