PLS-00306调用游标时出错
我想我可能在这里错过了一些东西。这是触发器的相关部分:
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循环可能是一个更好的解决方案。