Plsql 使用varray复制1中2个表的内容时出错

Plsql 使用varray复制1中2个表的内容时出错,plsql,oracle10g,cursor,oracle-sqldeveloper,Plsql,Oracle10g,Cursor,Oracle Sqldeveloper,我有以下表格: CREATE TABLE departments ( dep_na number(2) NOT NULL PRIMARY KEY, dname VARCHAR2(15), loc VARCHAR2(15) ); INSERT INTO departments VALUES (20,'CONTABILITY','SEVILLA'); INSERT INTO departments VALUES (30,'INVEST','MADRID'); COMMIT; CREA

我有以下表格:

CREATE TABLE departments (
dep_na  number(2) NOT NULL PRIMARY KEY,
dname  VARCHAR2(15), 
loc      VARCHAR2(15)
);
INSERT INTO departments VALUES (20,'CONTABILITY','SEVILLA');
INSERT INTO departments VALUES (30,'INVEST','MADRID');
COMMIT;
CREATE TABLE employees (
emp_nu    number(4)  NOT NULL PRIMARY KEY,
surname  VARCHAR2(10),
oficio    VARCHAR2(10),
dir       number(4),
date_a DATE      ,
salar   number(6,2),
comis  number(6,2),
dep_na   number(2) NOT NULL REFERENCES departments(dept_no)
);
ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY';
INSERT INTO employees VALUES (7369,'SANCHEZ','EMPLEADO',7902,'17/12/1990',1040,NULL,20);
INSERT INTO employees VALUES (7499,'ARROYO','VENDEDOR',7698,'20/02/1990',1500,390,30);
COMMIT;

create or replace
TYPE TDEP AS OBJECT(
dep_na NUMBER(2),
dname VARCHAR2(15),
loc VARCHAR2(15)
);

CREATE OR REPLACE TYPE TEMPLE AS OBJECT(
emp_nu    number(4),
surname  VARCHAR2(10),
oficio    VARCHAR2(10),
dir       number(4),
date_a DATE,
salar   number(6,2),
comision  number(6,2),
dep_na   TDEP
);

CREATE OR REPLACE TYPE VEMPLE AS VARRAY(20) OF TEMPLE;
我用varray和types创建了下面的表包,但是我有一个问题,当我在表包中插入employees和departments表的内容时,计算机会给我错误信息

CREATE TABLE pack(
array_employees VEMPLE,
departme TDEP
);
我对此代码有问题:

DECLARE
T VEMPLE;
A TDEP
CURSOR C1 is select * from departamentos order by dep_na;
CURSOR C2(DEPAR NUMBER) is select * from empleados where dep_na = depar;
j integer := 1;
BEGIN
for i in C1 LOOP 
  DBMS_OUTPUT.PUT_LINE(i.dep_na);
  T := NEW VEMPLE();
  A := NEW TDEP();
  j := 1;
  for x in C2(i.dep_na) loop
    if j < T.LIMIT THEN
      DBMS_OUTPUT.PUT_LINE(x.apellido || ' - ' || i.dep_na);
      T.extend;
      T(j) := NEW TEMPLE(NULL, NULL, NULL, NULL);
      T(j).departments := NEW TDEP(i.loc, NULL, NULL);
      j := j + 1;
    end if;
end loop;
INSERT INTO Grupos VALUES(i.A, T);
end loop;
end;
/

在Oracle中,我需要有关此查询的帮助。我的光标有问题。

直接的问题是您在declare部分的TDEP后缺少一个分号,这导致您的ORA-06550:第4行第1列:PLS-00103:在预期时遇到符号光标。。。错误您还没有显示,但您说这是一个光标错误,所以看起来是对的

但是你还有很多其他的错误,一些是因为命名不一致,我认为这部分是因为为了发布而改变了一些东西,但部分是因为你创建对象实例的方式。我认为这相当干净:

DECLARE
T VEMPLE;
A TDEP;
CURSOR C1 is select * from departments order by dep_na;
CURSOR C2(DEPAR NUMBER) is select * from employees where dep_na = depar;
j integer := 1;
BEGIN
for i in C1 LOOP 
  DBMS_OUTPUT.PUT_LINE(i.dep_na);
  T := NEW VEMPLE();
  -- supply values to constructor
  A := NEW TDEP(i.dep_na, i.dname, i.loc);
  j := 1;
  for x in C2(i.dep_na) loop
    if j < T.LIMIT THEN
      DBMS_OUTPUT.PUT_LINE(x.surname|| ' - ' || i.dep_na);
      T.extend;
      -- supply values to constructor
      T(j) := NEW TEMPLE(x.emp_nu, x.surname, x.oficio,
        x.dir, x.date_a, x.salar, x.comis, A);
      -- no idea what the next line is doing
      -- T(j).departments := NEW TDEP(i.loc, NULL, NULL);
      j := j + 1;
    end if;
end loop;
-- elements were wrong way round, which wouldn't matter if you
-- included the column names - which is good practice anyway
INSERT INTO pack VALUES(T, A);
end loop;
end;
/
。不过,不要试图从小提琴中的表格中进行选择,它会与对象类型发生冲突;这只是表明它没有错误


我想这是一个练习。从关系模式到对象模式的转换可能有更好、更有效的方法。

包含您得到的错误可能会有所帮助。你在TDEP后面漏掉了一个分号,这就是它所抱怨的吗?非常感谢!,亚历克斯普尔