Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中执行立即选择语句_Sql_Oracle_Plsql - Fatal编程技术网

Sql 在Oracle中执行立即选择语句

Sql 在Oracle中执行立即选择语句,sql,oracle,plsql,Sql,Oracle,Plsql,我正在一个查询中使用execute immediate语句 procedure p1 (p_pk1_column, p_pk2_column , p_conv_table_name ,p_MODUE_NAME ) is v_select_string := 'SELECT'''||p_MODUE_NAME||''',''' ||p_pk1_column || ''',''' || p_pk2_column ||''' FROM ' ||p_conv_table_nam

我正在一个查询中使用execute immediate语句

    procedure p1 (p_pk1_column, p_pk2_column , p_conv_table_name ,p_MODUE_NAME )
    is
    v_select_string   := 'SELECT'''||p_MODUE_NAME||''',''' ||p_pk1_column || ''',''' || p_pk2_column ||''' FROM ' ||p_conv_table_name || v_where_condition;
    execute immediate v_select_string  ;
    dbms_output.put_line('string:'||v_select_string  );
    end p1;
这里我在另一个过程p2中调用p1过程

PROCEDURE P2 IS
v_pk1_column:='a';
v_pk2_columnm:='b';
v_mod_name:='mOD1';
p1(v_pk1_column,v_pk2_columnm);
end p2;
/
在p2过程a中,b是p_conv_table_name的列名。我想执行select语句,如select p_mod_name,a,b from p_conv_table_name where condition;因此,它应该为p_conv_table_name中的a和b列提供值

但它的执行方式类似于从p_conv_table_name where condition中选择p_mod、p_pk1_col、p_pk2_col;
所以选择的只是列名,而不是该列中的值

请建议一些实现该栏中价值的方法


提前感谢

构建
SELECT
语句时,列名用单引号括起来,这将它们转换为字符串文字。将您的过程更改为类似以下内容:

CREATE OR REPLACE PROCEDURE P1 (p_pk1_column      IN VARCHAR2,
                                p_pk2_column      IN VARCHAR2,
                                p_conv_table_name IN VARCHAR2,
                                p_MODUE_NAME      IN VARCHAR2)
IS
  v_select_string    VARCHAR2(2000);
  v_where_condition  VARCHAR2(2000) := ' WHERE SOMETHING = SOMETHING_ELSE';
  csr                SYS_REFCURSOR;
  v_val_1            VARCHAR2(2000);
  v_val_2            VARCHAR2(2000);
  v_mod_name         VARCHAR2(2000);
BEGIN
  v_select_string   := 'SELECT ' || p_MODUE_NAME || ',' ||
                                    p_pk1_column || ',' ||
                                    p_pk2_column ||
                       ' FROM ' || p_conv_table_name ||
                       v_where_condition;

  dbms_output.put_line('string:' || v_select_string);

  OPEN csr FOR v_select_string;

  LOOP
    FETCH csr INTO v_mod_name, v_val_1, v_val_2;

    EXIT WHEN csr%NOTFOUND;         

    DBMS_OUTPUT.PUT_LINE('v_mod_name=''' || v_mod_name || '''  ' ||
                         'v_val_1=''' || v_val_1 || '''  ' ||
                         'v_val_2=''' || v_val_2 || '''');
  END LOOP;

  CLOSE csr;
END P1;
我还将代码更改为
OPEN
FETCH
游标,而不是使用
executeimmediate
OPEN
FETCH
通常更适合与动态
SELECT
语句一起使用


分享和享受。

对我来说,单引号似乎太多了?而不是“选择a、b”等。您正在执行“选择a”、“b”等。只需检查脚本的输出,您就会发现它类似于
从zzzz中选择“z”、“zz”、“zzz”。提供一个语法正确的示例是一个很好的实践为什么不想既不使用DBMS\U SQL包也不使用bind变量?当您像这样构建动态查询时,可以得到SQL注入,
DBMS\u SQL
和绑定变量帮助您避免它;如果您正在执行SELECT语句,则需要选择一些内容。。。