Oracle 如何运行该过程

Oracle 如何运行该过程,oracle,stored-procedures,Oracle,Stored Procedures,我试图运行上面的语句,但它抛出了下面提到的错误 exec home_lending_cus('9999999999', 'HOME LENDING', '11111111') varchar2类型的所有变量 ORA-00933: SQL Command not properly ended. ORA-06512: at 'HOME_LENDING_CUS', line 6 ORA-06512: at line1 正如@Aramillo指出的,字符串变量周围的引号是错误的,这使得动态SQL无法

我试图运行上面的语句,但它抛出了下面提到的错误

exec home_lending_cus('9999999999', 'HOME LENDING', '11111111')
varchar2类型的所有变量

ORA-00933: SQL Command not properly ended.
ORA-06512: at 'HOME_LENDING_CUS', line 6
ORA-06512: at line1

正如@Aramillo指出的,字符串变量周围的引号是错误的,这使得动态SQL无法工作。然而,我强烈建议转移到绑定变量,而不是串联。这不仅可以防止此类错误,还可以防止SQL注入:

CREATE OR REPLACE PROCEDURE home_lending_cus(
    id_no    VARCHAR2,
    prod_nme VARCHAR2,
    rpt_dte  NUMBER) authid current_user
AS
BEGIN
  EXECUTE immediate 
  ' CREATE TABLE abc AS
  SELECT bt.id,
    ct.cus_id
  FROM bnkr_tbl bt ,
    cus_tbl ct ,
    base_tbl bt
  WHERE bt.id  =ct.id
  AND ct.id    =bt.c_id
  AND bt.pr_nme='||prod_nme|| '
  AND bt.dte   ='||rpt_dte|| '
  AND bt.id    ='||id_no|| '
  GROUP BY bt.id,
    ct.cus_id';
END home_lending_cus; 

或者,更确切地说,如果允许您在DDL中使用绑定变量,则会出现这种情况。鉴于这一限制,我倾向于将其分为两个命令

CREATE OR REPLACE PROCEDURE home_lending_cus(
    id_no    VARCHAR2,
    prod_nme VARCHAR2,
    rpt_dte  NUMBER) authid current_user
AS
BEGIN
  EXECUTE immediate 
  ' CREATE TABLE abc AS
  SELECT bt.id,
    ct.cus_id
  FROM bnkr_tbl bt ,
    cus_tbl ct ,
    base_tbl bt
  WHERE bt.id  =ct.id
  AND ct.id    =bt.c_id
  AND bt.pr_nme= :1
  AND bt.dte   = :2
  AND bt.id    = :3
  GROUP BY bt.id,
    ct.cus_id' using prod_nme, rpt_dte, id_no;
END home_lending_cus; 

这段代码还有几个其他问题需要考虑:

  • 您的查询也无效,因为您在同一
    FROM
    子句中使用别名
    bt
    两次
  • 我建议使用SQL-99样式的联接,而不是逗号分隔的表列表
  • 动态创建表的Oracle代码总是有点可疑。您真的需要创建表,还是可以使用全局临时表?后者几乎总是更好的选择

  • 您尝试在哪个上下文/应用程序中执行该过程?可能只是缺少一个
    bnkr\u tbl
    发布
    create table
    语句。它抛出了相同的错误。您还可以为此添加exec procedure命令。ORA-01027-数据定义操作不允许使用绑定变量ORA-06512:在“home_lending_cus”第5行ORA-06512:在第1行,我尝试运行-exec home_lending_cus('99999999',20140912)
    CREATE OR REPLACE PROCEDURE home_lending_cus(
        id_no    VARCHAR2,
        prod_nme VARCHAR2,
        rpt_dte  NUMBER) authid current_user
    AS
    BEGIN
      EXECUTE immediate 
      ' CREATE TABLE abc (bt_id number, cus_id number)'
      EXECUTE IMMEDIATE 
      'INSERT INTO abc (bt_id, cus_id)
      SELECT bt.id,
        ct.cus_id
      FROM bnkr_tbl bt ,
        cus_tbl ct ,
        base_tbl bt
      WHERE bt.id  =ct.id
      AND ct.id    =bt.c_id
      AND bt.pr_nme= :1
      AND bt.dte   = :2
      AND bt.id    = :3
      GROUP BY bt.id,
        ct.cus_id' using prod_nme, rpt_dte, id_no;
    END home_lending_cus;