0

嗨,当我尝试编译下面的过程时,我总是收到错误它在我替换 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;where rownum=1select 语句中使用时有效,但记录方式似乎对我不起作用我在这里做错了什么?

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

预先感谢您的反馈。

4

2 回答 2

0

1)您需要确保组合名称的最大或更少长度last_name,否则会引发数值错误
2)Oracle 没有+' '+要附加的格式,
而是使用emp.first_name||' 'emp.last_name
3)您的代码仅适用于单行数据,或rownum = 1在查询中的 where 条件中使用。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;
于 2013-09-19T04:36:39.243 回答
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
于 2013-09-19T12:26:16.320 回答