尝试使用INTO子句设置记录列时出错

时间:2013-09-19 01:52:31

标签: oracle plsql

当我尝试编译下面的程序时,我总是会收到错误。当我更换时它会起作用 TYPE NameCombine IS RECORD(FIRST_NAME employees.FIRST_NAME%TYPE, LAST_NAME employees.LAST_NAME%TYPE, Combined_NAME employees.LAST_NAME%TYPE); 使用first_name employees.first_name%TYPE;并在select语句中使用where rownum=1但是记录方式对我来说似乎不起作用我在这里做错了什么?

CREATE OR REPLACE PROCEDURE Combined_name
IS
TYPE NameCombine IS RECORD(FIRST_NAME employees.FIRST_NAME%TYPE, LAST_NAME  
employees.LAST_NAME%TYPE, Combined_NAME employees.LAST_NAME%TYPE);

BEGIN 

SELECT
emp.FIRST_NAME,
emp.LAST_NAME,
emp.FIRST_NAME +' '+ emp.LAST_NAME
INTO 
 NameCombine.FIRST_NAME, 
 NameCombine.LAST_NAME,
 NameCombine.Combined_NAME
FROM 
EMPLOYEES emp;
dbms_output.put_line( NameCombine.FIRST_NAME );
END;

具有与上述类似语法示例的网站: http://plsql-tutorial.com/plsql-records.htm

错误

Error(7,1): PL/SQL: SQL Statement ignored
Error(12,2): PLS-00330: invalid use of type name or subtype name
Error(14,34): PL/SQL: ORA-00904: : invalid identifier
Error(17,1): PL/SQL: Statement ignored
Error(17,23): PLS-00330: invalid use of type name or subtype name

提前感谢您的反馈。

2 个答案:

答案 0 :(得分:0)

1)您需要确保组合名称的长度最大或更短last_name, 否则会引发数值错误
2)Oracle没有附加+' '+格式,而是使用emp.first_name||' 'emp.last_name
3) 您的代码仅适用于单行数据,或者在查询中的where条件中使用rownum = 1 4)为你创建的record类型声明一个对象。

CREATE OR REPLACE
PROCEDURE Combined_name
IS
     TYPE NAMECOMBINE 
     IS RECORD(
               FIRST_NAME employees.FIRST_NAME%TYPE,
               LAST_NAME employees.LAST_NAME%TYPE,
               COMBINED_NAME EMPLOYEES.LAST_NAME%TYPE
               );
     obj NAMECOMBINE;
BEGIN
     SELECT emp.FIRST_NAME,emp.LAST_NAME,emp.FIRST_NAME||' '||emp.LAST_NAME
     INTO OBJ.FIRST_NAME,OBJ.LAST_NAME,OBJ.Combined_NAME
     FROM EMPLOYEES EMP
     WHERE ROWNUM = 1;
     DBMS_OUTPUT.PUT_LINE( OBJ.FIRST_NAME );
END;

/

如果您需要显示多行的记录,您可以使用bulk collect into子句,如下所示:

CREATE OR REPLACE
PROCEDURE Combined_name
is
     TYPE NameCombine IS
     RECORD
     (
          FIRST_NAME    VARCHAR2(20),
          LAST_NAME     VARCHAR2(20),
          Combined_NAME VARCHAR2(20));
     obj NameCombine;
     CURSOR test_cur
     IS
     SELECT emp.FIRST_NAME,emp.LAST_NAME,emp.FIRST_NAME||' '||emp.LAST_NAME
     FROM EMPLOYEES EMP;
     type test_rec_arr IS TABLE OF NameCombine INDEX BY pls_integer;
     test_rec test_rec_arr;
BEGIN
     OPEN test_cur;
     LOOP
          FETCH test_cur bulk collect INTO test_rec limit 10;
          FOR i IN test_rec.first..test_rec.last
          LOOP
               dbms_output.put_line(test_rec(i).FIRST_NAME);
          END LOOP;
          EXIT
     WHEN test_rec.count = 0;
     END LOOP;
     CLOSE test_cur;
END;

答案 1 :(得分:0)

当错误地使用数据类型或子类型说明符代替常量,变量或表达式时,通常会发生此编译错误。

当您在PL / SQl中声明某些类型时,您要做的是创建自定义数据类型。您无法将值分配给数据类型。您需要先创建该自定义类型的变量,然后才能为其赋值。

  TYPE NameCombine IS RECORD(FIRST_NAME employees.FIRST_NAME%TYPE, LAST_NAME  
employees.LAST_NAME%TYPE, Combined_NAME employees.LAST_NAME%TYPE);

NameCombineVar NameCombine;

...

INTO 
 NameCombineVar.FIRST_NAME, 
 NameCombineVar.LAST_NAME,
 NameCombineVar.Combined_NAME