PLS-00306调用游标时出错

时间:2020-03-05 18:47:38  来源:igfitidea点击:

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

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

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

解决方案

回答

对我来说很好。

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

回答

@抢

如果我们剪切/粘贴我在这里的代码,那么行吗?

我们如何/在哪里调用代码?它是触发因素吗?

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

回答

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

OPEN columnNames('TEMP');

工作了一段时间

FOR columnName IN columnNames循环

没有。如果FOR语句还包含如下所示的参数,则它会很好地工作:

FOR columnName IN columnNames('TEMP')循环

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

@Rob的评论。我不允许发表评论,因此请在此处进行更新。缺失的参数是我上面描述的。我们添加了一个响应,指出我们只是删除了FOR循环。当时我们似乎并不了解为什么删除它会有所作为。这就是为什么我尝试解释的原因,因为根据需要,FOR循环可能是一个更好的解决方案。