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将单行过滤到记录变量中。