gpt4 book ai didi

linux - 将 bash 用户输入传递给 sql 语句时出错

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:11 25 4
gpt4 key购买 nike

我正在尝试编写一个 bash 函数,该函数提示输入架构所有者并删除所有相应的架构。

function db_cleanup

{
#accept user input
read -p "Schema Owner: " input

sqlplus -s $usr1/$pwd1@$sid1 << EOF


declare
usr_d varchar2(10) := '&input'; --reas user input here
sqlstmt varchar2(128);
begin
sqlstmt := 'drop user '||$usr_d||' cascade';
dbms_output.put_line(sqlstmt); execute immediate sqlstmt;

sqlstmt := 'drop user ab_'||$usr_d||' cascade';
dbms_output.put_line(sqlstmt); execute immediate sqlstmt;

sqlstmt := 'drop user xy_'||$usr_d||' cascade';
dbms_output.put_line(sqlstmt); execute immediate sqlstmt;
end;
/
EOF
}

输出如下:

    Enter Schema Owner: ABC
Enter value for usr_in:
User requested Interrupt or EOF detected.

-bash-3.2$

请告诉我如何解决这个问题。提前致谢。

最佳答案

汇总@244an 和我自己的评论:

  • '&input' 应该是 '$input',因为您引用的是 shell 变量。
  • $usr_d 应该是 usr_d (没有 $),因为您在这里不是引用 sheel 变量;这来自 PL/SQL declare 部分。
  • SQL*Plus 的 -s 标志会抑制横幅;但你最初的问题表明了这一点,所以不确定你是否在途中的某个地方丢失了它。

所以:

function db_cleanup
{
#accept user input
read -p "Schema Owner: " input

sqlplus -s $usr1/$pwd1@$sid1 << EOF
set timing off
set feedback off
set serverputput on size 10000
spool $log_file.out

declare
usr_d varchar2(10) := '$input';
sqlstmt varchar2(128);
begin
sqlstmt := 'drop user '||usr_d||' cascade';
dbms_output.put_line(sqlstmt);
execute immediate sqlstmt;

sqlstmt := 'drop user ab_'||usr_d||' cascade';
dbms_output.put_line(sqlstmt);
execute immediate sqlstmt;

sqlstmt := 'drop user xy_'||usr_d||' cascade';
dbms_output.put_line(sqlstmt);
execute immediate sqlstmt;
end;
/
EOF
}

不确定您是否想要清理给定的架构...您确实不想意外删除许多用户。 Any of these首先,您可能也有自己的。

关于linux - 将 bash 用户输入传递给 sql 语句时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15098809/

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