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变量之间发现类型不匹配
请将错误分类。非常感谢。