什么是PL / SQL中的替换变量?

时间:2013-11-18 17:35:40

标签: plsql

我正在使用此代码使用替换变量输入部门名称。

DECLARE
MAX_DEP_VAR NUMBER;
BEGIN
SELECT MAX(DEPTNO) INTO MAX_DEP_VAR
FROM DEPT;
INSERT INTO DEPT
VALUES(MAX_DEP_VAR+10, &DEPTNAME, NULL);
END;

但它给出了这个错误:

  

ORA-06550:第0行,第0列:
  PLS-00801:内部错误[ph2csql_strdef_to_diana:bind]
  ORA-06550:第6行,第13栏:
  PL / SQL:ORA-06544:PL / SQL:内部错误,参数:[ph2csql_strdef_to_diana:bind],[],[],[],[],[],[],[]
  ORA-06550:第6行,第1栏:
  PL / SQL:忽略SQL语句

1 个答案:

答案 0 :(得分:1)

以下是生成您所看到的错误的一种方法(Oracle XE 11.2.0.2.0,Windows 8.1 x64):

SQL> DEFINE deptname=": abc"
SQL> CREATE OR REPLACE TRIGGER test_trigger
  2    AFTER UPDATE ON DEPT
  3    FOR EACH ROW
  4  BEGIN
  5    DECLARE
  6      MAX_DEP_VAR NUMBER;
  7    BEGIN
  8      SELECT MAX(DEPTNO) INTO MAX_DEP_VAR
  9        FROM DEPT;
 10      INSERT INTO DEPT
 11        VALUES(MAX_DEP_VAR+10, &DEPTNAME, NULL);
 12    END;
 13  END;
 14  /
old  11:       VALUES(MAX_DEP_VAR+10, &DEPTNAME, NULL);
new  11:       VALUES(MAX_DEP_VAR+10, : abc, NULL);

Warning: Trigger created with compilation errors.

SQL> SHOW ERRORS TRIGGER test_trigger;
Errors for TRIGGER TEST_TRIGGER:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PLS-00801: internal error [ph2csql_strdef_to_diana:bind]
7/5      PL/SQL: SQL Statement ignored
7/17     PL/SQL: ORA-06544: PL/SQL: internal error, arguments:
         [ph2csql_strdef_to_diana:bind], [], [], [], [], [], [], []

我碰巧知道使用冒号后跟空格后跟触发器中的名称会导致您看到的错误消息。但是,可能还有其他方法可以生成此错误,而您可能会遇到其中一种错误。

您的替换变量deptname包含哪些值?例如,如果它包含Accounts,那么您的SQL将最终成为以下内容:

DECLARE
MAX_DEP_VAR NUMBER;
BEGIN
SELECT MAX(DEPTNO) INTO MAX_DEP_VAR
FROM DEPT;
INSERT INTO DEPT
VALUES(MAX_DEP_VAR+10, Accounts, NULL);
END;

当然,这是无效的,因为Accounts需要在单引号中让Oracle将其识别为字符串。请记住,SQL * Plus将使用其值替换替换变量,而不考虑这是否为您提供有效的SQL。

如果您已将deptname声明为Accounts,那么我建议您更换该行

VALUES(MAX_DEP_VAR+10, &DEPTNAME, NULL);

VALUES(MAX_DEP_VAR+10, '&DEPTNAME.', NULL);

这样,当SQL * Plus用其值替换deptname时,最终会得到

VALUES(MAX_DEP_VAR+10, 'Accounts', NULL);

这是有效的。