oracle plsql中的无效字符

czfnxgou  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(295)

这里,当我执行这个查询时,它显示我无效的字符。如何解决是错误。

EXECUTE IMMEDIATE('SELECT COUNT(*) INTO' ||VAR_L_COUNT||'FROM'|| P_TABLE ||
                     ' WHERE  ' || AMOUNT || ' > ' ||  LIMIT_AMT  ||  ' AND  EMPID =  '''||  VAR_PI_EMPID||''';');
RETURN VAR_L_COUNT;
y3bcpkx1

y3bcpkx11#

很明显,不是那样的,你也注意到了。

  • 根据您使用的参数,这似乎是函数的一部分(例如p_tablelimit_amtvar_pi_empid);通常,如果你发布了整个代码,它会有所帮助
  • 正如kpasha评论的那样,你错过了在关键字和命令的其余部分之间提供空格;明显的错误是from子句
  • 在动态SQL中,您不会在语句内执行insert into,而是在执行它时执行
  • 注意SQL注入;在适当的情况下使用dbms_assert包和绑定变量
  • 动态SQL语句不能以分号结尾
  • 考虑使用q-引号机制,而不是乘单引号
  • 为了调试的目的,最好将整个语句组合在一个局部变量中,显示它(使用dbms_output.put_line)或将它用作函数的 * 返回值 *,以便您可以首先查看它,然后-一旦您确定一切正常-执行它。

这是一个工作示例;它可能需要被修改,这取决于你在你的模式/表中真正拥有什么。
样本数据:

SQL> SELECT * FROM some_table;

EMPID          AMOUNT
---------- ----------
1                 100
2                 200
3                 300

功能:

SQL> CREATE OR REPLACE FUNCTION f_test (p_table      IN VARCHAR2,
  2                                     p_limit_amt  IN NUMBER,
  3                                     p_empid      IN NUMBER)
  4     RETURN NUMBER
  5  IS
  6     l_str        VARCHAR2 (500);
  7     var_l_count  NUMBER;
  8  BEGIN
  9     l_str :=
 10           'SELECT COUNT(*) FROM '
 11        || DBMS_ASSERT.sql_object_name (p_table)
 12        || ' WHERE amount > '
 13        || p_limit_amt
 14        || ' AND empid =  :a';
 15
 16     EXECUTE IMMEDIATE l_str
 17        INTO var_l_count
 18        USING p_empid;
 19
 20     RETURN var_l_count;
 21  END;
 22  /

Function created.

测试:

SQL> SELECT f_test ('some_table', 50, '1') result FROM DUAL;

    RESULT
----------
         1

SQL>
7xzttuei

7xzttuei2#

1.尽可能使用绑定变量。
1.在你不能清理的地方清理你的输入。
1.不要在EXECUTE IMMEDIATE代码中包含语句终止符(;)。
1.如前所述,在文字和连接变量之间缺少空格。

CREATE FUNCTION function_name(
  p_table      IN VARCHAR2,
  amount       IN NUMBER,
  limit_amt    IN NUMBER,
  var_pi_empid IN VARCHAR2
)
IS
  var_l_count NUMBER(10,0);
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*)'
                || ' FROM ' || DBMS_ASSERT.SQL_OBJECT_NAME(p_table)
                || ' WHERE  :1 > :2'
                || ' AND    EMPID =  :3'
    INTO  var_l_count
    USING amount, limit_amt, var_pi_empid;

  RETURN VAR_L_COUNT;
END;
/

如果amountlimit_amt是列(而不是变量),那么不要将它们作为变量传递:

CREATE FUNCTION function_name(
  p_table      IN VARCHAR2,
  var_pi_empid IN VARCHAR2
)
IS
  var_l_count NUMBER(10,0);
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*)'
                || ' FROM ' || DBMS_ASSERT.SQL_OBJECT_NAME(p_table)
                || ' WHERE  amount > limit_amt'
                || ' AND    EMPID =  :1'
    INTO  var_l_count
    USING var_pi_empid;

  RETURN VAR_L_COUNT;
END;
/

相关问题