当我尝试编译下面的程序时,我总是会收到错误。当我更换时它会起作用
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
提前感谢您的反馈。
答案 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