oracle - 在 Shell 脚本中执行 PLSQL block 时出现问题

标签 oracle shell plsql

我正在尝试使用 shell 脚本删除具有特定后缀(作为参数 $1 传递)的表。

如果选择了父表而没有删除其子表,则我将绕过父表并增加异常 block 中的计数器。

当我在 sql Developer 中运行此脚本并将 $1 替换为正确的值时,它可以工作。但是当我运行这个 shell 脚本时,它被卡住了。

您能看一下并告诉我,我在 shell 脚本中缺少什么吗?

代码:

#!/bin/bash

cat <<ENDDROPNEWTABS >dropnewtabs.sql
set pagesize 100

DECLARE

t_cnt NUMBER;
CURSOR C001
IS
SELECT table_name FROM user_tables WHERE table_name LIKE '%$1%';

BEGIN
BEGIN SELECT COUNT(*) INTO t_cnt FROM user_tables WHERE table_name LIKE '%$1%'; 
END;

WHILE(t_cnt > 0) LOOP
FOR i IN C001 LOOP
BEGIN EXECUTE IMMEDIATE 'DROP TABLE '||i.table_name;
EXCEPTION
WHEN OTHERS THEN
t_cnt := t_cnt+1;
NULL;
END;      
t_cnt := t_cnt-1;
END LOOP;
END LOOP;

END;

exit
ENDDROPNEWTABS

echo "Dropping the tables created for this task..."

sqlplus -s usn/pwd@sid @dropnewtabs.sql >tablesDropped.txt

#END

最佳答案

您在匿名 block 的 END; 之后缺少 /,因此它永远不会执行它,并且 exit 将是被视为前一个命令的一部分。 / 非常类似于 SQL Developer 中的“运行”。

...
END LOOP;

END;
/

exit
ENDDROPNEWTABS

(您不需要 SELECT 周围的 BEGIN/END,也不需要 NULL异常处理程序,但这些不会破坏任何东西;默默地消除所有可能的异常也不是一个好主意,只需寻找您期望看到的异常即可。而且我个人发现使用一些缩进更容易理解)。

关于oracle - 在 Shell 脚本中执行 PLSQL block 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495322/

相关文章:

php - 在 txt 文件上显示 php 输出 Linux 命令行

linux - Oracle 数据库存在,但引用它时出现错误

linux - shell 脚本 : if condition not evaluating properly

linux - AWS CLI 同步错误 - 找不到文件

sql - View 到物化 View 的脚本化转换 (Oracle)

sql - Oracle 错误处理

sql - 定期更新与 DBMS 并行执行

sql - 查找按订单聚合的最大日期 - Oracle SQL

performance - Oracle,使用子选择时性能低下

oracle - sqlplus到csv科学数转换