我创建了一个非常简单的表:
CREATE TABLE TMP ("ID" VARCHAR2(20 BYTE));
然后尝试这样做:
DECLARE
whatever varchar2(20) := :bananas;
BEGIN
MERGE INTO tmp t USING
(SELECT whatever AS this_id FROM DUAL) d
ON (t.id = d.this_id)
WHEN NOT MATCHED THEN
INSERT (id) VALUES (d.this_id);
END;
然后输入绑定
并收到此错误:
Error starting at line : 1 in command -
DECLARE
whatever varchar2(20) := :bananas;
BEGIN
MERGE INTO tmp2 t USING
(SELECT whatever AS this_id FROM DUAL) d
ON (t.id = d.this_id)
WHEN NOT MATCHED THEN
INSERT (id) VALUES (d.this_id);
END;
Error report -
Missing defines
我没有运气弄清楚它想要什么。如果我更换香蕉'具有像' a'它工作,但不是当我使用变量并绑定值。有人知道我的查询有什么问题吗?感谢。
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
TNS for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
修改的: 我刚刚注意到错误并没有阻止数据正确合并......虽然错误仍然存在但
答案 0 :(得分:2)
我可能会一起跳过DECLARE部分并随处使用:香蕉而不是任何东西。 BEGIN之后放:香蕉:=:香蕉;而且你没有得到任何错误。 祝你好运。
答案 1 :(得分:1)
尝试在语句后面添加一个斜杠。然后突出显示整个块并按F5。
答案 2 :(得分:0)
我有同样的错误消息。我的DB列是32个字符(VARCHAR2(32 CHAR)
),过滤器的声明变量是64个字符(szId varchar2(32) := :Id;
)。我复制并粘贴了一些值作为输入变量。出于某种原因,我最终获得了空白。所以我得到33个字符并提到错误。我做了32个字符的声明,并开始得到更有意义的错误。
我的情况是您的数据库列为VARCHAR2(20 BYTE)
,声明为whatever varchar2(20) := :bananas;
。我可能会看到byte
的总大小不是char
。
答案 3 :(得分:0)
我刚遇到类似的情况。
经过简短研究后,发现了该错误。 代码在哪里
DECLARE
VAR001 NUMBER := NULL;
...
SELECT *
...
AND FIELD001 = VAR001
我已经放弃设置VAR001
答案 4 :(得分:0)
以我为例,在调用CallableStatement :: execute()之前,我绑定了尝试访问的OUT参数。