在oracle中怎么对一张表中的列进行循环,比如说,我执行第一个字段,再执行第二个。。。一直到N
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在oracle中怎么对一张表中的列进行循环,比如说,我执行第一个字段,再执行第二个。。。一直到N相关的知识,希望对你有一定的参考价值。
求大神详细讲解下。。。
参考技术A 要对表中的字段进行遍历吗? 用user_tab_colsbegin
for i in (
select column_name from user_tab_cols where table_name=upper('表名'))
loop
dbms_output.put_line(i.column_name);
end loop;
end;本回答被提问者和网友采纳 参考技术B 什么意思,什么目的?目标不明确
PL/SQL 使用一张表中的列数据更新表,基于不同表之间的相等性
【中文标题】PL/SQL 使用一张表中的列数据更新表,基于不同表之间的相等性【英文标题】:PL/SQL Update table using column data from one table, based on equality between different tables 【发布时间】:2015-06-11 22:21:16 【问题描述】:基本上,我有 2 个表:EMPLOYEES、DBPZIP。
我需要根据两个语句使用 DBPZIP 中的 ZIP 列更新表 EMPLOYEES 中的 ZIP 列:
EMPLOYEES LOCATION 必须相等,DBPZIP LOCATION 和 DBPZIP DEPARTMENT 必须是 'Store'
到目前为止,我尝试了两种方法:
create or replace PROCEDURE insertZip IS
BEGIN
UPDATE EMPLOYEES
SET EMPLOYEES.ZIP = ( SELECT DPBZIP.POSTCODE
FROM DPBZIP
WHERE DPBZIP.DEPARTMENT = 'Store')
WHERE DPBZIP.LOCATION = EMPLOYEES.LOCATION;
END;
第二种方式:
create or replace PROCEDURE insertZip IS
UPDATE EMPLOYEES
SET EMPLOYEES.ZIP = ( SELECT DPBZIP.POSTCODE
FROM DPBZIP
WHERE DPBZIP.DEPARTMENT = 'Store'
AND DPBZIP.LOCATION = EMPLOYEES.LOCATION);
END;
当我将两个 DBPZIP 都放在 select 语句中时,我得到单行子查询返回多行。
如果我把一个放在外面,我会得到无效的标识符。
【问题讨论】:
此链接将帮助您psoug.org/reference/update.html(请参阅基于返回多个值的查询和相关更新的更新) 您的“第二种方式”只需要额外的更新条件:UPDATE .. WHERE DPBZIP.LOCATION = EMPLOYEES.LOCATION; 首先,编写一个查询,其中包含要更改的数据和要更改的值。可以在此处找到将其更改为更新语句的过程:***.com/questions/28182852/… 【参考方案1】:我不确定为什么您的过程中有 COMMIT
语句。如果您只更新一行,这对我来说并不是一个特别好的主意。其次,除了@Kamil 指出的问题之外,您的查询还有另一个问题;即使您限制子查询返回的行数,只要DBZIP
中没有对应于department
和location
的值的记录,EMPLOYEES.zip
将设置为NULL
。在这种情况下也许这是可以接受的,但我会重写查询如下。
UPDATE employees e
SET e.zip = ( SELECT MAX(d.postcode) FROM dpbzip d
WHERE d.department = 'Store'
AND d.location = e.location )
WHERE EXISTS ( SELECT 1 FROM dpbzip d
WHERE d.department = 'Store'
AND d.location = e.location );
注意我在上面使用了表别名,所以我不必一遍又一遍地输入表名。另请注意,我使用聚合(在本例中为MAX()
)来确保在子查询中只返回一行。 (WHERE EXISTS
子句中的子查询可以返回多行没有问题。)
【讨论】:
【参考方案2】:第一种方式: 它在语法上不正确,因为 UPDATE 语句的范围内不存在 EMPLOYEES 别名。
第二种方式: 您得到单行子查询返回多行,因为在 SQL 语句中使用“=”您需要等式右侧的一个值。假设一个位置 (DBZIP.LOCATION) 只返回一个 (DBZIP.POSTCODE),您可以通过添加谓词 ROWNUM = 1 或在 select 子句中添加 DISTINCT 来限制返回的行数。
【讨论】:
以上是关于在oracle中怎么对一张表中的列进行循环,比如说,我执行第一个字段,再执行第二个。。。一直到N的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE数据库 存储过程 中 从几张级联表中查询 出结果集,循环添加到另一张表的某一字段
oracle中,如何在一张表插入数据,使得插入数据的某些字段为其他表中的数据