Ошибки при попытке установить столбец записи с условием INTO

Привет, когда я пытаюсь скомпилировать приведенную ниже процедуру, я всегда получаю ошибки. Он работает, когда я заменяю 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=1 в инструкции select, но способ записи, похоже, не работает для меня, что я делаю неправильно здесь?

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 ответа

Эта ошибка компиляции обычно возникает, когда вместо константы, переменной или выражения ошибочно используется спецификатор данных или спецификатор подтипа.

Когда вы объявляете что-то вроде типа в 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


1) Вам необходимо убедиться, что объединенное имя будет иметь максимальную или меньшую длину last_name, иначе оно вызывает ошибку числового значения 2) Oracle не имеет формата +' '+ для добавления, вместо этого используйте emp.first_name||' 'emp.last_name 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;

licensed under cc by-sa 3.0 with attribution.