在 Oracle 中,我们有一个很小的 sql 文件 (truncate_table.sql),它调用一个截断表的函数:
BEGIN
DBMS_OUTPUT.PUT_LINE('FuncTruncTable executing...');
IF ( FuncTruncTable(upper('&1'))=FALSE) THEN
DBMS_OUTPUT.PUT_LINE('FuncTruncTable failed');
END IF;
END;
/
对于&1
,我们通过schema_name.table_name
。我意识到 PostgreSQL 中的表名都是小写的。所以,在 PostgreSQL 中我尝试过
IF ( select FuncTruncTable(lower('&1'))=FALSE) THEN....;
这个 SQL 文件由 shell 脚本 ( ) 调用,truncate_single_table.sh
基本上如下所示
TableName=$1
LOG_FILE=/some_dir/log/truncate_log.txt
sqlplus user_name/user_pass @/some_dir/sql/truncate_table.sql $TableName > $LOG_FILE
truncate_single_table.sh
被另一个 shell 脚本调用truncate_tables.sh
。
truncate_tables.sh
组装一堆表并调用 truncate_single_table.sh 将它们逐个截断,如下所示:
. /some_dir/bin/truncate_single_table.sh schema_name.TABLE_1 NEW
. /some_dir/bin/truncate_single_table.sh schema_name.TABLE_2 APPEND
. /some_dir/bin/truncate_single_table.sh schema_name.TABLE_3 APPEND
等等。
NEW
和APPEND
用于对表进行计数 - 必须截断的表的数量必须与实际截断的表的数量相匹配。如果发生错误,作业会发送警告,因为(TotalNumber - number of errors) <> TotalNumber
。
我正在尝试将进程转换为 PostgreSQL。我对 PostgreSQL 完全陌生。只需更换
sqlplus user_name/user_pass @/some_dir/sql/truncate_table.sql $TableName > $LOG_FILE
和
psql -d "dbname=$dbname user='user_name' password='user_pass' host=$HostName" -f /some_dir/sql/truncate_gnxsawork_table.sql $TableName > $LOG_FILE
不起作用。
也许应该使用我不知道的不同选项(除了-d
, )。-f
您可以将表名
psql
作为变量传递:并在脚本中使用它作为