【问题标题】:concatenate input variable in oracle alter command while connecting oracle from linux从linux连接oracle时在oracle alter命令中连接输入变量
【发布时间】:2021-07-13 21:02:20
【问题描述】:

我正在尝试使用以下代码在 oracle 表空间中添加数据文件,但出现错误:ORA-02140:无效的表空间名 请参考 output3 创建数据文件:

for i in `echo $output1 | tr ' ' '\n' | tr '\n' ' '`;
do
echo $i;    **#Its printing tablespace name like SYSTEM**
output2=`sqlplus -s usr/pwd as sysbackup <<END2
set serveroutput on;
set linesize 200
set head off;
SELECT TABLESPACE_NAME ||','|| ROUND (SUM (BYTES) / 1048576) FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = '${i}' GROUP BY TABLESPACE_NAME;
exit;
END2`

**#output2 is printing tablespace name and total tablespace size like SYSAUX 2048**

echo $output2 | tr ' ' '\n' > test.csv


while IFS=',' read -r col1 col2
do
echo $col2
fiftin_per=$((col2/15))
echo $fiftin_per  **#Feteched column2 from csv file which contains total tablespace space and calculated 15 per of it**
if [[ "${fiftin_per}" -gt "${avail_space}" ]];
then
echo "Assign to manual queue as required space is not available on mount point."
else
var='/'
dfname=".data00"
random_val=`shuf -i 100000000-1000000000 -n 1`
ext=".dbf"
fname="'$mount_name$var${i}$random_val$ext'"
echo $fname  **#printing datafilename like \oradata\fname\.dbf**
echo ${i}
output3=`sqlplus -s usr/pwd as sysbackup <<END2
set serveroutput on;
set linesize 200
set head off;
DECLARE
var varchar(50);
BEGIN
dbms_output.put_line("Value of i"||${i});
END;
/
exit;
END2`
echo $output3  **#Trying to add datafile but getting error ORA-02140**
fi
done < test.csv
done

我得到低于输出,我无法在选择命令中传递 linux 变量。请参考 output2 相同。但是,当我尝试从 linux for 循环传递相同的变量以更改命令或 dbms_output.put_line 时出现错误:PLS-00357: Table,View Or Sequence reference 'SYSAUX' not allowed in this context ORA-06550: line 4, column 1 : PL/SQL: 语句被忽略

Output : 
/oradata01/POCDB/data/system01.dbf
/oradata01/POCDB/data
208958
SYSAUX TEST5
SYSAUX
2048
136
' /oradata01/POCDB/data/SYSAUX465368588.dbf'
dbms_output.put_line('Value of i'||SYSAUX); 

 PLS-00357: Table,View Or Sequence reference 'SYSAUX' not allowed in this context ORA-06550: line 4, column 1: PL/SQL: Statement ignored

【问题讨论】:

  • 请在您的问题中发布控制台输出和输出文件的示例。不要发布屏幕截图;请复制/粘贴并格式化文本。
  • @pmdba : 添加输出
  • 我指的是 实际 输出,而不是输出描述。您的错误表明存在无效的表空间名称 (${i}),但您没有向我们展示正在创建的实际表空间名称。如果看不到实际执行的 DDL 命令,我们就无法告诉您出了什么问题。
  • 附带说明,您可以删除alter tablespace||' '||${i}||' add datafile '||$fname||' size '||${fiftin_per}||'m autoextend off maxsize 30720m'; 命令的'||$fname||' 部分,Oracle 将为您选择一个唯一的文件名。您真的希望单个数据文件增长到 30,720 MB 左右吗?
  • @MarkStewart :我尝试这样做,但文件名无效。(ORA-02236)

标签: linux oracle


【解决方案1】:

我已将变量声明如下:

output3=`sqlplus -s usr/pwd as sysbackup <<END2
set serveroutput on;
set linesize 200
set head off;
DECLARE
var varchar(50):='${i}';
BEGIN
dbms_output.put_line("Value of i"||var);
END;
/
exit;
END2`

output : Its printing the tablespace name which I am getting from linux loop

【讨论】:

  • 那么,它现在工作了吗?我注意到您的问题中的输出在文件路径' /oradata01/POCDB/data/SYSAUX465368588.dbf' 中有一个前导空白,看起来您修复了PLS-00357 错误,对吧?
  • @MarkStewart 是的,它已修复!
  • 太棒了!您可以通过答案旁边的“接受”链接继续并接受自己的答案。这样一来,寻找没有接受答案的问题的人就可以忽略您的问题。谢谢!
猜你喜欢
  • 2019-06-17
  • 2021-12-25
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多