【问题标题】:plSQL Syntax For Writing Stored Procedure w/ 3 Variablespl SQL语法用于编写带有/ 3个变量的存储过程
【发布时间】:2016-02-14 10:56:16
【问题描述】:

我有这么长的 SQL 语句块,我需要为它创建一个接受 3 个变量的存储过程。变量是 invoice、NewDate、TransactionDate,数据类型分别是 integer、date 和 date。我试图创建存储过程,但语法把我弄乱了。我将使用 Coldfusion 和 cfstoredproc 调用存储过程,因此使用井号。并不是说我在 ColdFusion 上需要任何帮助。只是试图提供尽可能多的信息。

truncate table fix_the_date; commit; 
insert into fix_the_date 
(Location,Invoice,NewDate,TransactionDate) 
values 
('Corporate', '#invoice#'
, to_date('#NewDate#', 'mm/dd/yyyy')
,to_date('#TransactionDate#','mm/dd/yyyy')); 
commit;
<!--- About a dozen other queries go here that I won't waste your time with--->

更新 1: 以下是我现在所拥有的存储过程。我收到以下错误:

执行数据库查询时出错。 [宏媒体][Oracle JDBC 驱动程序][Oracle]ORA-01858: 发现一个非数字字符 数字是预期的 ORA-06512:在“THEDB.FIXMISSINGDATE”,第 13 行 ORA-06512: 在第 1 行错误发生在第 4 行

CREATE OR REPLACE PROCEDURE THEDB."FIXMISSINGDATE" (Invoice integer, NewTransactionDate date, TransactionDate date) IS
BEGIN

EXECUTE IMMEDIATE 'TRUNCATE TABLE FixTheDate;
commit;

EXECUTE IMMEDIATE 'TRUNCATE TABLE DeletePayTrans';
commit;

insert into FixTheDate(Site, Invoice_No, Pay_Date, Old_Date)
values ('Corporate', 'TO_CHAR(#Invoice#)','#NewTransactionDate#','#TransactionDate#');
commit;

/*******************************
Plus a bunch of other queries here
*******************************/

END FIXMISSINGDATE;
/

更新 2:根据 cmets 中的反馈,删除英镑符号

CREATE OR REPLACE PROCEDURE THEDB."FIXMISSINGDATE" (Invoice integer, NewTransactionDate date, TransactionDate date) IS
BEGIN

EXECUTE IMMEDIATE 'TRUNCATE TABLE FixTheDate;
commit;

EXECUTE IMMEDIATE 'TRUNCATE TABLE DeletePayTrans';
commit;

insert into FixTheDate(Site, Invoice_No, Pay_Date, Old_Date)
values ('Corporate', TO_CHAR(Invoice), NewTransactionDate, TransactionDate);
commit;

/*******************************
Plus a bunch of other queries here
*******************************/

END FIXMISSINGDATE;
/

【问题讨论】:

  • 如果您使用 to_date 函数将数据类型转换为日期,则您的数据类型不能是日期。
  • 在 Oracle 中,truncate table 和所有 DDL 在执行开始和结束时执行隐式提交。所以第一次提交是多余的。
  • 从 ColdFusion 连接时也不需要最后一次提交。此外,将日期或时间戳对象从 ColdFusion 传递到您的 SP。不要乱搞字符串。
  • 问题是如何将它们放在一个存储过程中。
  • 另外,不确定这是否是复制+粘贴错误,但您在 EXECUTE IMMEDIATE 语句之一的末尾缺少结束引号。

标签: oracle plsql coldfusion


【解决方案1】:

您的问题可能与尝试在存储过程中发出 DDL 语句有关(请参阅 here)。

我将假设您的 NewDateTransactionDate 也是 varchar2(因为如果它们实际上是日期,您的插入语句将不起作用)。

CREATE OR REPLACE PROCEDURE my_proc(
    invoice         IN integer,
    NewDate         IN varchar2,
    TransactionDate IN varchar2) AS

BEGIN

    EXECUTE IMMEDIATE 'TRUNCATE TABLE fix_the_date';

    INSERT INTO fix_the_date (Location,Invoice,NewDate,TransactionDate) 
    VALUES ('Corporate', invoice, TO_DATE(NewDate, 'mm/dd/yyyy'),
    TO_DATE(TransactionDate,'mm/dd/yyyy')); 
    COMMIT;

END;
/

...或者,如果您真的过时了:

CREATE OR REPLACE PROCEDURE my_proc(
    invoice         IN integer,
    NewDate         IN date,
    TransactionDate IN date) AS

BEGIN

    EXECUTE IMMEDIATE 'TRUNCATE TABLE fix_the_date';

    INSERT INTO fix_the_date (Location,Invoice,NewDate,TransactionDate) 
    VALUES ('Corporate', invoice, NewDate, TransactionDate); 
    COMMIT;

END;
/

【讨论】:

  • 是的,两者都是日期。什么是gob?另外,我刚刚注意到变量“Invoice”作为一个表的整数进入,并且该表被插入到它的 varchar2 中。那么我应该更改存储过程以将发票显示为 varchar2 吗?我继续构建存储过程,现在尝试执行它时出错。
  • 哈哈...抱歉,我在一个编造的桌子上进行测试 - 固定名称。您可以在插入发票时将其转换为 varchar2。在参数中保留为integer,但插入为:TO_CHAR(invoice)
  • 我用存储过程的代码更新了这个问题。我收到以下错误:执行数据库查询时出错。 [Macromedia][Oracle JDBC 驱动程序][Oracle]ORA-01858:在需要数字的地方发现了一个非数字字符 ORA-06512:在“THEDB.FIXMISSINGDATE”,第 13 行 ORA-06512:在第 1 行发生了错误在第 4 行
  • 删除# 符号,以及参数周围的单引号。使用我给出的示例 - 不要在不必要的地方添加额外的即兴创作。
  • 没有它们,它怎么知道它是一个 ColdFusion 变量?在存在这些变量的 CFM 页面中调用此存储过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2013-11-07
相关资源
最近更新 更多