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后面漏掉了一个分号,这就是它所抱怨的吗?非常感谢!,亚历克斯普尔