gpt4 book ai didi

sql - 如何将 bash 变量传递给 sqlplus,然后将该输出传递给另一个变量

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:23 24 4
gpt4 key购买 nike

所以我想做的是清除Oracle数据库中PDB的审核日志。 PDB 的名称每次都可以不同,因此我无法使用 tnsnames to sqlplus 直接进入 PDB 来执行此操作。我将命令传递到 bash,然后将它们传递到 SQLPLUS 命令。除了其中一个之外,每一个都有效,但我似乎不知道如何让它工作。

我的代码是

AUDIT="DELETE FROM SYS.AUD$ WHERE NTIMESTAMP# < sysdate-30;"
FINDPDB="select pdb_name from dba_pdbs where pdb_name != 'PDB\$SEED';"
ALTER="alter session set container=$FINDPDB;"


sqlplus -S /nolog <<EOF1
connect / as sysdba
set echo off feedback off head off pages 0
set serveroutput on
$FINDPDB
$ALTER
$AUDIT
exit;
EOF1

我不断收到的错误是

alter session set container=select pdb_name from dba_pdbs where pdb_name != 'PDB$SEED';
*
ERROR at line 1:
ORA-65015: missing or invalid container name

这告诉我,它没有将 select 语句的输出传递给 $FINDPDB,而是将实际的 select 语句本身传递给 $FINDPDB。

有没有办法可以将此值传递给 ALTER 变量并让它更改 session 并清除 sys.aud$ 表?

最佳答案

The error I keep getting is

alter session set container=select pdb_name from dba_pdbs where pdb_name != 'PDB$SEED';
*
ERROR at line 1:
ORA-65015: missing or invalid container name

This tells me that it's not passing the output of the select statement to $FINDPDB, but rather the actual select statement itself.

我不明白为什么您希望将 SELECT 查询的输出传递到 $FINDPDB 中。您正在组合一个大的长字符串,bash 将其传递到 sqlplus 的标准输入,然后将 sqlplus 的输出写入 stdout。 bash 绝不会挑选出 sqlplus 输出的某些行并将它们放入 shell 变量中。

事实上,在调用 sqlplus 之前,请尝试将 echo $ALTER 添加到 bash 脚本中。您很可能会发现输出是

alter session set container=select pdb_name from dba_pdbs where pdb_name != 'PDB$SEED';

如果是这样,那么在您启动 sqlplus 之前,bash 就已经完成了您不想要的替换。

您似乎希望 bash 和 sqlplus 有某种来回对话。我会放弃这种方法。我不会尝试将 PDB 名称放入 shell 变量中,而是将其放入 sqlplus 替换变量中。我会尝试如下(未测试):

sqlplus -S /nolog <<"EOF1"
connect / as sysdba
set echo off feedback off head off pages 0
set serveroutput on
column pdb_name new_value pdb
select pdb_name from dba_pdbs where pdb_name != 'PDB\$SEED';
alter session set container = &pdb.;
delete from sys.aud$ where ntimestamp# < sysdate - 30;
exit;
EOF1

我们使用column pdb_name new_value pdb将替换变量pdb设置为从名为pdb_name的列中选择的下一个值。然后,我们运行 select 查询来获取 PDB 名称,并将其存储在 pdb 中。一旦我们在替换变量中获得了该值,就可以发出 alter session 语句来更改 PDB,最后发出 delete 语句来从 PDB 中删除数据。

正如另一个答案中所建议的那样,我很想避免为此使用 PL/SQL block 。我希望在更改 PDB 后解析 delete 语句,因为我希望确保删除“正确”PDB 中的数据。我对此使用 PL/SQL 的担忧是,PL/SQL 编译器将在解析 block 时确定要从哪个表中删除,这将在运行 block 之前进行,因此在执行 alter session 语句以更改 PDB 之前。但是,我对 Oracle 12c 中的 PDB 和 CDB 不太了解,无法判断这是一个真正的问题还是毫无根据的废话。

我无法访问可插入的 Oracle 12c 数据库来运行类似的操作,因此我无法告诉您该脚本是否有效。如果没有,希望它能让您知道该去哪里。

关于sql - 如何将 bash 变量传递给 sqlplus,然后将该输出传递给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32769695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com