Sql 由于发出对象声明而导致错误。(数据类型不一致)
我正在使用一个函数,它在过程中返回一个表。我希望该过程显示表的内容 函数的代码是Sql 由于发出对象声明而导致错误。(数据类型不一致),sql,oracle,object,plsql,Sql,Oracle,Object,Plsql,我正在使用一个函数,它在过程中返回一个表。我希望该过程显示表的内容 函数的代码是 CREATE OR REPLACE TYPE employee_attr AS OBJECT ( employee_id NUMBER(6,0), first_name VARCHAR2(20 BYTE) , last_name
CREATE OR REPLACE TYPE employee_attr AS OBJECT (
employee_id NUMBER(6,0),
first_name VARCHAR2(20 BYTE) ,
last_name VARCHAR2(20 BYTE) ,
email VARCHAR2(25 BYTE) ,
phone_number VARCHAR(20 BYTE) ,
hire_date DATE ,
job_id VARCHAR2(10 BYTE) ,
department_id NUMBER(4,0) ,
salary NUMBER(8,2) ,
manager_id NUMBER(6,0) ,
commission_pct NUMBER );
CREATE OR REPLACE TYPE employee_table AS TABLE OF employee_attr;
CREATE OR REPLACE FUNCTION get_employee_data (
col_name_in VARCHAR2,
col_val_in NUMBER)
FROM
(SELECT employee_id, first_name,
last_name, email,
phone_number, hire_date,
job_id, department_id,
salary, manager_id,
commission_pct FROM EMPLOYEES2 WHERE '|| col_name_in || ' = ' || col_val_in || ' ) e ';
--DBMS_OUTPUT.PUT_LINE(lv_query);
EXECUTE IMMEDIATE lv_query BULK COLLECT INTO required_employees;
RETURN required_employees;
END;/
我希望以下过程显示函数的内容
PROCEDURE display_employee_data(
col_name_in IN VARCHAR2,
col_val_in IN NUMBER)
AS
lv_query VARCHAR2(1000);
emp_data employee_attr;
TYPE employee_data_cur_tp IS REF CURSOR ;
employee_data_cur employee_data_cur_tp;
BEGIN
lv_query := 'SELECT employee_id, first_name, last_name, email,
phone_number, hire_date, job_id, department_id,
salary, manager_id, commission_pct
FROM TABLE(get_employee_data(' ||''''|| col_name_in || ''''||
' , ' || col_val_in ||' ))';
DBMS_OUTPUT.PUT_LINE(lv_query);
OPEN employee_data_cur FOR lv_query;
LOOP
FETCH employee_data_cur INTO emp_data;
EXIT WHEN employee_data_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emp_data.employee_id || ' ' || emp_data.first_name);
END LOOP;
CLOSE employee_data_cur;
END display_employee_data;
当我运行程序时,如下所示
BEGIN
employee.display_employee_data('EMPLOYEE_ID', 30);
END;
它会引发以下错误:
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at "CHAITU.EMPLOYEE", line 394
ORA-06512: at line 2
第394行是循环开始的地方,在fetch语句之前
请帮助我找到正确的对象声明方式,以便解决错误。谢谢必须初始化对象。修改后的程序如下:
You need to omit %rowtype otherwise the code looks good. Thanks
CREATE OR REPLACE PROCEDURE display_employee_data(
col_name_in IN VARCHAR2,
col_val_in IN NUMBER)
AS
lv_query VARCHAR2(1000);
emp_data employee_table;
TYPE employee_data_cur_tp IS REF CURSOR;
employee_data_cur employee_data_cur_tp;
BEGIN
lv_query := 'SELECT * FROM TABLE(get_employee_data(' ||''''|| col_name_in || ''''||
' , ' || col_val_in ||' ))';
DBMS_OUTPUT.PUT_LINE(lv_query);
OPEN employee_data_cur FOR lv_query;
LOOP
FETCH employee_data_cur INTO emp_data;
EXIT WHEN employee_data_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emp_data.employee_id || ' ' || emp_data.first_name);
END LOOP;
CLOSE employee_data_cur;
END display_employee_data;
PROCEDURE display_employee_data(
col_name_in IN VARCHAR2,
col_val_in IN NUMBER)
IS
emp_data employee_attr DEFAULT employee_attr(NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL);
lv_query VARCHAR2(1000);
TYPE employee_data_cur_tp IS
REF CURSOR ;
employee_data_cur employee_data_cur_tp;
BEGIN
lv_query := 'SELECT employee_id, first_name, last_name, email,
phone_number, hire_date, job_id, department_id,
salary, manager_id, commission_pct
FROM TABLE(get_employee_data(' ||''''|| col_name_in || ''''||
' , ' || col_val_in ||' ))';
DBMS_OUTPUT.PUT_LINE(lv_query);
OPEN employee_data_cur FOR lv_query;
LOOP
FETCH employee_data_cur INTO emp_data.employee_id, emp_data.first_name, emp_data.last_name,
emp_data.email, emp_data.phone_number, emp_data.hire_date,
emp_data.job_id, emp_data.department_id, emp_data.salary,
emp_data.manager_id, emp_data.commission_pct;
EXIT WHEN employee_data_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emp_data.employee_id || ' ' || emp_data.first_name);
END LOOP;
CLOSE employee_data_cur;
END display_employee_data;
您的
employee_表%ROWTYPE
基本上不是employee_attr
的元素吗?在您发布的代码中,employee_表是一个对象集合,而不是关系表,因此不能与%ROWTYPE一起使用。共享和享受。@NicholasKrasnov当我将返回类型指定为employee\u attr
时,它会发出一条错误消息,返回类型应该是记录或游标变量。所以,我在问题中发布的代码中没有指定返回类型。@NicholasKrasnov谢谢你,谢谢你inputs@NicholasKrasnov在代码中,我使用了一个ref游标。那么,为什么我会得到类型不匹配。“你能建议我应该在哪里进行更改吗?”尼古拉斯·克拉斯诺夫我遵循了你的建议,但我仍然得到了不匹配错误。当我使用ref游标时,我得到以下错误<代码>ORA-00932:不一致的数据类型:当我定义游标以匹配数据类型时,预期-get-nd,它抛出以下错误PL/SQL:语句忽略PLS-00382:表达式类型错误PL/SQL:SQL语句忽略PLS-00386:在“EMP_DATA”中,在FETCH cursor和INTO变量之间发现类型不匹配
请将错误分类。非常感谢。