Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在plsql中获取复合记录类型中的值_Oracle_Plsql - Fatal编程技术网

Oracle 如何在plsql中获取复合记录类型中的值

Oracle 如何在plsql中获取复合记录类型中的值,oracle,plsql,Oracle,Plsql,第4行错误:ORA-06550:4行第5列:PLS-00320: 此表达式类型的声明不完整或格式不正确 ORA-06550:第2行,第1列:PL/SQL:项目被忽略ORA-06550:第4行, 第1列:PLS-00320:此表达式的类型声明为 不完整或格式错误的ORA-06550:第10行第10列:PL/SQL: ORA-00904::无效标识符ORA-06550:第9行第1列:PL/SQL: 忽略SQL语句 我使用集合来处理这种情况。希望这能对你有所帮助 declare cursor emp

第4行错误:ORA-06550:4行第5列:PLS-00320: 此表达式类型的声明不完整或格式不正确 ORA-06550:第2行,第1列:PL/SQL:项目被忽略ORA-06550:第4行, 第1列:PLS-00320:此表达式的类型声明为 不完整或格式错误的ORA-06550:第10行第10列:PL/SQL: ORA-00904::无效标识符ORA-06550:第9行第1列:PL/SQL: 忽略SQL语句


我使用集合来处理这种情况。希望这能对你有所帮助

declare 
cursor emp_dept_cur is
select emp.empno,dept.deptno 
from emp,dept
where emp.deptno =dept.deptno 
and empno =7839;
type emp_detp_record is table of emp_dept_cur%rowtype;
emp_dept emp_detp_record;
begin 
open emp_dept_cur;
loop
fetch emp_dept_cur bulk collect into emp_dept;
exit when emp_dept.count=0;
null;
end loop;
close emp_dept_cur;
end;
/

我使用集合来处理这种情况。希望这能对你有所帮助

declare 
cursor emp_dept_cur is
select emp.empno,dept.deptno 
from emp,dept
where emp.deptno =dept.deptno 
and empno =7839;
type emp_detp_record is table of emp_dept_cur%rowtype;
emp_dept emp_detp_record;
begin 
open emp_dept_cur;
loop
fetch emp_dept_cur bulk collect into emp_dept;
exit when emp_dept.count=0;
null;
end loop;
close emp_dept_cur;
end;
/

您的代码有两个问题。。。第4行的错误是由您为属性选择的名称引起的;将第5行中的
emp
更改为
x
,将
dept
更改为
y
,声明将生效


然后在过程主体中,从行集合中获取数据。行集是通过连接两个表创建的,这一事实与此无关;首先计算联接,然后从中提取行,并尝试将值分离为
emp
dept
子工作。这是不可能的;当数据来自连接时,事实上它是一个连接而不是一个单独的表是“桥下的水”。如果您真的想或需要将
emp
dept
中的数据保存在单独的属性中,那么您应该将其分别从
emp
dept
中带入。。。第4行的错误是由您为属性选择的名称引起的;将第5行中的
emp
更改为
x
,将
dept
更改为
y
,声明将生效


然后在过程主体中,从行集合中获取数据。行集是通过连接两个表创建的,这一事实与此无关;首先计算联接,然后从中提取行,并尝试将值分离为
emp
dept
子工作。这是不可能的;当数据来自连接时,它是一个连接而不是一个表的事实就是“桥下的水”如果您确实希望或需要将
emp
dept
中的数据保存在单独的属性中,则应将其分别从
emp
dept
中引入。

您可以使用
光标
并将记录锚定到光标的
行类型

declare 
  cursor emp_dept_cur is
    select * 
    from emp 
    join dept on emp.deptno = dept.deptno;
  emp_dept_rec emp_dept_cur%rowtype;
begin 
  select * into 
    emp_dept_rec
  from emp 
  join dept on emp.deptno =dept.deptno 
  where empno = 7839;
 -- dbms_output.put_line(emp_dept_rec.deptno); -- raises PLS-00302: component 'deptno' must be declared
end;
一些注意事项:

  • 请不要对联接使用旧的Oracle语法(FROM子句中有多个表)。改用ANSI连接
  • 这将导致列名重复出现问题。在您的示例中,有两列名为
    deptno
    ——一列来自emp,另一列来自dept。这将在您尝试访问它时立即引发错误(请参阅我的代码中的注释行)

您可以使用
光标
并将记录锚定到光标的
行类型

declare 
  cursor emp_dept_cur is
    select * 
    from emp 
    join dept on emp.deptno = dept.deptno;
  emp_dept_rec emp_dept_cur%rowtype;
begin 
  select * into 
    emp_dept_rec
  from emp 
  join dept on emp.deptno =dept.deptno 
  where empno = 7839;
 -- dbms_output.put_line(emp_dept_rec.deptno); -- raises PLS-00302: component 'deptno' must be declared
end;
一些注意事项:

  • 请不要对联接使用旧的Oracle语法(FROM子句中有多个表)。改用ANSI连接
  • 这将导致列名重复出现问题。在您的示例中,有两列名为
    deptno
    ——一列来自emp,另一列来自dept。这将在您尝试访问它时立即引发错误(请参阅我的代码中的注释行)

我认为这不受支持。我设置了一个测试并给表加了别名,这样我就可以把每个表放在它需要去的地方,但它给了我一个不同的错误:PLS-00494:不支持强制多个记录目标。我会继续玩它,但我希望知道更多这方面的人能提供一个答案。我不认为这是支持的。我设置了一个测试并给表加了别名,这样我就可以把每个表放在它需要去的地方,但它给了我一个不同的错误:PLS-00494:不支持强制多个记录目标。我将继续使用它,但我希望了解更多信息的人能够提供答案。我知道这是公认的答案,但它并不能真正回答您是否可以拥有复合记录类型而不必指定所有字段的问题。如果我们要指定所有字段,我们可以使用与原始问题相同的方法。@Bob-不确定您的意思,但如果您认为“选择*”是问题所在,则不是。计算连接,然后从中提取数据;在这一点上,连接产生的行没有“内存”,也没有单个表产生的行。@Bob:通过创建这样的记录类型,可能会导致PLS-00597,因为查询将提供一个结果集。我在过去遇到过这个问题,因此从那时起就开始使用集合。@mathguy让我澄清一下。在OP中的示例中,他试图将两个行类型合并为一个。正如我在他的帖子上评论的那样,我认为这是不可能做到的。这里使用的解决方案与OP代码中尝试的结果不同。我认为您的帖子是正确的答案。@Bob-如果您所说的“我的解决方案”是指这里的解决方案,那么它不是我的。我没有读过这个解决方案,我不知道也不在乎它是否有效。我的观点是OP最初的错误不是试图将两种类型合并为一种;更确切地说,他是在尝试将已经连接的东西拆开,并将其“提取”到两个行类型变量中。这是行不通的。我知道这是公认的答案,但它并没有真正回答这样一个问题:如果您可以拥有复合记录类型,而不必指定所有字段。如果我们要指定所有字段,我们可以使用与原始问题相同的方法。@Bob-不确定您的意思,但如果您认为“选择*”是问题所在,则不是。计算连接,然后从中提取数据;在这一点上,连接产生的行没有“内存”,也没有单个表产生的行。@Bob:通过创建这样的记录类型,可能会导致