【问题标题】:Is there any PL/SQL script to modify column value of each table in each schema of Oracle Database是否有任何 PL/SQL 脚本来修改 Oracle 数据库每个模式中每个表的列值
【发布时间】:2021-09-26 10:15:24
【问题描述】:

我编写了 pl/sql 代码来修改一个模式的表中的列值。但是我需要在每个模式的每个表中执行相同的脚本。我将从电子表格中获取表名、列名的列表。

define schema_name = 'D';
define hours_offset = '(-3/24)';
set echo off;
set timi off;
set heading off;
set feedback off;
set linesize 250;
spool convert_01.sql
select 'set echo on;' from dual;
select 'set timi on;' from dual;
select 'set heading on;' from dual;
select 'set feedback on;' from dual;
select 'set linesize 250;' from dual;
select 'spool convert_01.log;' from dual;
select 'update '||owner||'.'||table_name||' set '||column_name||' 
='||column_name||' +    &hours_offset;' 
from dba_tab_columns where owner = '&schema_name' and 
(
data_type = 'DATE' or 
data_type like 'TIMESTAMP%'
) and
data_type not like 'TIMESTAMP%WITH TIME ZONE'
order by owner, table_name, column_name;
select 'spool off;' from dual;
spool off;

【问题讨论】:

  • 您想获取数据库中每个DATETIMESTAMP 输入的列并添加一个数字吗?这看起来很奇怪,你为什么要这么做?
  • 请分享您的 PL/SQL 代码并解释它与上述脚本的关系。
  • 顺便说一下,SQL*Plus 脚本中不需要从 dual 中选择,因为 SQL*Plus 有 prompt

标签: oracle plsql plsql-package


【解决方案1】:

我需要在每个模式的每个表中执行相同的脚本

这很可能不是真的。有些用户(模式)根本不应该修改,例如SYS、SYSTEM、CTXSYS、APEX180200等。

因此,您宁愿收集您想要跳过的用户列表(或您想要影响的用户;这取决于您)。然后将使用该列表而不是 '&schema_name'

一个简单的选择是将用户列表存储到一个表中,并将其内容用作当前脚本中的子查询。


不相关,但是:

我已经写了pl/sql代码...

不;你写的是一个纯 SQL 脚本 可读 由 SQL*Plus (可能还有其他一些理解你使用的命令的工具)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多