【问题标题】:Oracle SQL parameterized query via Unix Shell通过 Unix Shell 的 Oracle SQL 参数化查询
【发布时间】:2014-06-03 22:37:39
【问题描述】:

我有一个 Shell 批处理,我想在 Unix 环境中使用 Oracle SQL plus 提示符执行一个 sql 查询。

查询有一个参数,该参数必须动态更改宽度批处理执行参数(一个日期)。

这是 MY_QUERY.sql 文件中的查询:

SELECT ID || ';' || NAME FROM PERSONS WHERE BIRTH=&1

而 Unix Shell 脚本是:

LOGIN=$1
PASSWORD=$2
OUTPUT_FOLDER=$3
DATE=$4
echo "Date_birth: '${DATE}'"
echo exit | sqlplus ${LOGIN}/${PASSWORD} @"../sql/MY_QUERY.sql" "'${DATE}'" >> "${OUTPUT_FOLDER}/Output.csv"

我发现 Output.csv 文件是空的。但是当我直接在查询中输入日期时,我得到了想要的输出。

SELECT ID || ';' || NAME FROM PERSONS WHERE BIRTH='31/12/2014'

PS:日期不为空或null,因为它是使用上面的行显示的

echo "Date_birth: '${DATE}'"

PS:当我直接使用SqlPlus提示@c:\sql\MY_QUERY.sql '31/12/2014'执行这一行时,也会显示想要的结果@

【问题讨论】:

    标签: sql oracle shell parameter-passing sqlplus


    【解决方案1】:

    假设您的 $DATE 不包含白色字符。 假设您的问题仅涉及 UNIX(因为在您的示例中不是 UNIX)。

    然后把你的sql脚本改成

    SELECT ID || ';' || NAME FROM PERSONS WHERE BIRTH='31/12/2014';
    exit;
    

    并将 UNIX 脚本的最后一行更改为

    sqlplus $LOGIN/$PASSWORD @/absolute_path/MY_QUERY.sql $DATE
    

    即没有管道。 (如果可行,您可以返回到您的相对路径和重定向。) 如果问题仍然存在,请在 $PASSWORD@$ORACLE_SID 或 @TWO_TASK 之后添加包含数据库名称且必须导出的内容。 如果它不能解决问题,让我看看你的输出内容。

    【讨论】:

    • 我找到了问题所在。替换查询中的参数 &1 时,找不到日期的单引号。这是 sqlplus 输出:版权所有 (c) 1982, 2005, Oracle。版权所有。 Connecté à : Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production old 6 : AND p.birth= TO_DATE(&1,'dd/mm/YYYY') new 6 : AND p.birth= TO_DATE(31/12/ 2014,'dd/mm/YYYY') AND p.birth=TO_DATE(31/12/2014,'dd/mm/YYYY') * ERREUR à la ligne 6 : ORA-01858: Caractère non numérique trouvé à la place d 'un caractère numérique
    • 我已经找到了解决问题的方法。我在查询中直接将单引号添加到参数中:SELECT ID || ';' ||出生人姓名='&1';
    【解决方案2】:

    我找到了解决问题的方法。我在查询中直接将单引号添加到参数中:

    SELECT ID || ';' || NAME FROM PERSONS WHERE BIRTH='&1';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多