【问题标题】:Passing table name and column name dynamically to PL/SQL Stored procedure将表名和列名动态传递给 PL/SQL 存储过程
【发布时间】:2016-07-05 18:35:06
【问题描述】:

我正在尝试将表名和列名传递给 oracle 中的存储过程,但它给了我以下错误:table or view does not exist

下面是代码:

create or replace procedure jz_dynamic_sql_statement
    (p_table_name    in varchar2,
     p_col1_name     in varchar2,
     p_check_result  out integer)

  as

    v_error_cd          est_runtime_error_log.error_cd%type;
    v_error_msg         est_runtime_error_log.error_msg%type;
    v_sql               varchar2(1024);
    v_result            number(10);

  begin
    v_result    := 0;
    v_sql       := 'select  count(*)  from ' || p_table_name ||' WHERE COLUMNNAME=' || p_col1_name;


    execute immediate v_sql into v_result;
    p_check_result := v_result;

  end;

【问题讨论】:

  • 这有什么令人困惑的地方?该表不存在。
  • 我的意思是我已经有桌子了。
  • 除非您试图混淆帖子中的数据库列名,否则 where 子句没有意义。
  • @GordonLinoff - 表可能存在,但调用者与定义者的权限可能会干扰表的可见性。
  • 好吧,我需要过滤它,我将把这个想法用于其他目的,例如更新声明

标签: sql oracle plsql execute-immediate dbms-output


【解决方案1】:

如果返回的错误表明该表不存在,则表示您传入的表不存在或运行该过程的用户无法访问它。

您可以添加一个 dbms_output.put_line 语句来显示您正在构建的查询,然后尝试自己运行它,然后再尝试立即执行。然后您就知道需要修复哪些错误。

dbms_output.put_line('query : '||v_sql);

一定要开启 dbms_output。

此外,从看起来你想要做的事情来看,你需要传递列名和列值。除非您要查询的表总是具有列名“COLUMNNAME”。

试试这个:

v_sql       := 'select  count(*)  from ' || p_table_name ||' WHERE COLUMNNAME=''' || p_col1_name|| '''';

【讨论】:

  • 这个运行良好 v_sql := 'select count(*) from ' || p_table_name ||'';但是当我用列名包含 where clasue 时,它​​会在上面给出以下错误。
  • 您尝试查询的表是否有“COLUMNNAME”列?
  • 是的。它有一个名为“COLUMNNAME”的列
  • 我刚刚注意到你没有包围你在单引号中传入的 COLUMNNAME 值。我会用更多信息更新我的答案。
  • 更好用'select count(*) from ' || p_table_name ||' WHERE COLUMNNAME= :val'; execute immediate v_sql into v_result using p_col1_name;
猜你喜欢
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多