2015-08-28 82 views
-2

我需要创建一个存储过程,至此我必须从select语句中创建一个表,我必须在其中插入参数。 这里是我的查询:从创建和选择语句创建存储过程

CREATE TABLE DBL_JW AS 
     SELECT * FROM ( 
     SELECT m.IDM, 
      m2.IDM AS dups_key 
     FROM members_tbl m 
     LEFT OUTER JOIN members_tbl m2 
     ON (m.IDM != m2.IDM 
     AND m.DBIRTH = m2.DBIRTH 
     AND utl_match.jaro_winkler_similarity(m.SNAME,m2.SNAME) > 90 
     AND utl_match.jaro_winkler_similarity(m.FNAME,m2.FNAME) > 95)) 
     Where dups_key IS NOT NULL; 

我试图写这个存储过程:

CREATE OR REPLACE PROCEDURE JW_DBL_POT 
(
    P_SNAME IN NUMBER 
, P_FNAME IN NUMBER 
, P_RC OUT SYS_REFCURSOR 
) AS 
BEGIN 
    OPEN P_RC 
    EXECUTE IMMEDIATE 
     CREATE TABLE DBL_JW AS 
     SELECT * FROM ( 
     SELECT m.IDM, 
      m2.IDM AS dups_key 
     FROM members_tbl m 
     LEFT OUTER JOIN members_tbl m2 
     ON (m.IDM != m2.IDM 
     AND m.DBIRTH = m2.DBIRTH 
     AND utl_match.jaro_winkler_similarity(m.SNAME,m2.SNAME) > P_SNAME 
     AND utl_match.jaro_winkler_similarity(m.FNAME,m2.FNAME) > P_FNAME)) 
     Where dups_key IS NOT NULL; 
END JW_DBL_POT; 

我面对这样的错误: - PLS-00103:出现符号“CREATE” 即使删除了EXECUTE IMMEDIATE指令,我也有同样的错误。我如何管理它? Thx

+2

您没有将[字符串参数](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#CJACGJJG)传递给'immediate immediate'。什么应该进入'P_RC'?为什么你要在运行时创建一个表;或者是在其他表中复制数据的表(然后会过时)? –

回答

0

如果你绝对不得不将这些信息存储在一张表中,这听起来像只是暂时需要它作为修复数据的一部分。

而不是每次运行代码时创建一个表,然后在完成之后删除它(这是我假定您的计划是针对此表的!),为什么不创建全局临时表(GTT )一次,然后用它在每个会话的基础上存储数据 - 即。只有您的会话可以看到在该会话期间存储在那里的数据。

+0

嗨,感谢您的建议;我不知道。那么我如何使用Global Temporary Table编写? – freestyle

+0

我强烈建议你阅读关于GTTs。 [试试这个](https://oracle-base.com/articles/misc/temporary-tables)开始。文档中还有很多。 – Boneist