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

Oracle 尝试使用INTO子句设置记录列时出错,oracle,plsql,Oracle,Plsql,嗨,当我尝试编译下面的过程时,我总是收到错误,当我替换它时,它会工作 类型NameCombine是记录(名员工。名员工%TYPE,姓员工。姓员工%TYPE,名员工。姓员工%TYPE) 使用first\u name员工。first\u name%类型并在select语句中使用where rownum=1,但记录方式似乎对我不起作用,我在这里做错了什么 CREATE OR REPLACE PROCEDURE Combined_name IS TYPE NameCombine IS RECORD(FI

嗨,当我尝试编译下面的过程时,我总是收到错误,当我替换它时,它会工作
类型NameCombine是记录(名员工。名员工%TYPE,姓员工。姓员工%TYPE,名员工。姓员工%TYPE)
使用
first\u name员工。first\u name%类型
并在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;
具有与上述类似语法示例的网站:

错误

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
提前感谢您的反馈。

1)您需要确保组合名称的最大长度为
姓氏
, 否则会引起数值错误
2) Oracle没有要附加的
+'+
格式,
而是使用
emp.first_name | emp.last_name

3) 您的代码将仅适用于单行数据,或者在查询的where条件中使用
rownum=1

4) 为已创建的
记录
类型声明一个对象

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;
/

如果需要显示多行的记录,则有如下
批量收集到
子句:

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;

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

当您在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

很快:您声明了一个名为
NameCombine
类型。您需要声明该类型的变量,并在该变量中进行选择。例如:类型NameCombine\u T是RECORD。。。;名称联合收割机名称联合收割机;开始…1。您没有声明变量2。您已经声明了一个记录类型,它只能保存一行,因此必须使用where filter将单行过滤到记录变量中。