简体   繁体   English

为什么这个PL / SQL查询不能使用ODP.NET执行

[英]Why this PL/SQL query doesn't execute using ODP.NET

Somewhere in my code there's a query generated which is going to execute using: 在我的代码中的某处,生成了一个查询,该查询将使用以下命令执行:

command.ExecuteNonQuery();

but for the following query, it throws this exception: 但对于以下查询,它会抛出此异常:

{"ORA-01036: illegal variable name/number"}

The strange point is that if I copy this query to Toad and set its parameter values, It executes without any problem. 奇怪的是,如果我将此查询复制到Toad并设置其参数值,它执行没有任何问题。

My query which is set in command.CommandText is: 我在command.CommandText设置的查询是:

declare vv2 number ; 
BEGIN 
:vv := '';

begin SKY.BUSINESS_OBJECT_PKG.REGISTER(B_TYPE_ID=>:B_a_TYPE_ID, B_ID=>:B_b_ID); end;

INSERT INTO GALAXY.E_CONTENTS(
    CONTENT,
    HASH_CODE,
    FILE_NAME,
    THUMBNAIL,
    ID,
    LOCKED_BY_ID,
    TYPE_ID
)
VALUES 
(
    :P_c_CONTENT,
    :P_d_HASH_CODE,
    :P_e_FILE_NAME,
    :P_f_THUMBNAIL,
    :P_g_ID,
    :P_h_LOCKED_BY_ID,
    :P_i_TYPE_ID
);

begin SKY.BUSINESS_OBJECT_PKG.REGISTER(B_TYPE_ID=>:B_j_TYPE_ID, B_ID=>:B_k_ID); end;

INSERT INTO EVENT_MANAGEMENT.UI_EVENT(
    NOTIFICATION_PORT,
    WORK_ITEM,
    WORK_ITEM_DESC,
    BO_DESC,
    BO_CHANGES_ID,
    SMART_SERVICE_VALUE,
    CONTEXT_ID,
    CONTEXT_TYPE_ID,
    DESCRIPTION,
    EVENT_DATE,
    CREATION_DATE,
    SENDER_ID,
    MACHINE,
    EVENT_CATEGORY,
    REFERENCE_ID,
    EVENT_MODE,
    HANDLED_DATE,
    HISTORY,
    IS_VIEWED,
    IS_ACTIVE,
    ID,
    LOCKED_BY_ID,
    TYPE_ID
)
VALUES 
(
    :P_l_NOTIFICATION_PORT,
    :P_m_WORK_ITEM,
    :P_m_WORK_ITEM_DESC,
    :P_o_BO_DESC,
    :P_p_BO_CHANGES_ID,
    :P_q_SMART_SERVICE_VALUE,
    :P_r_CONTEXT_ID,
    :P_s_CONTEXT_TYPE_ID,
    :P_t_DESCRIPTION,
    :P_u_EVENT_DATE,
    :P_v_CREATION_DATE,
    :P_w_SENDER_ID,
    :P_x_MACHINE,
    :P_y_EVENT_CATEGORY,
    :P_z_REFERENCE_ID,
    :P_aa_EVENT_MODE,
    :P_ab_HANDLED_DATE,
    :P_ac_HISTORY,
    :P_ad_IS_VIEWED,
    :P_ae_IS_ACTIVE,
    :P_af_ID,
    :P_ag_LOCKED_BY_ID,
    :P_ah_TYPE_ID
);

begin SKY.BUSINESS_OBJECT_PKG.REGISTER(B_TYPE_ID=>:B_ai_TYPE_ID, B_ID=>:B_aj_ID); end;

INSERT INTO ACCOUNTING.TRANSACTIONS(
    TITLE,
    LAST_CHANGE_ID,
    EFFECTIVE_DATE,
    CREATE_DATE,
    BO_REFRENCE_ID,
    CREATOR_ID,
    COMPANY_ID,
    VOUCHER_ID,
    TRANSACTION_TYPE_VALUE,
    FISCAL_YEAR_ID,
    TRANSACTION_STATE_VALUE,
    FYTB_ID,
    REVISORY_TRANSACTION_ID,
    BO_TYPE_VALUE,
    TRANSACTION_NUMBER,
    ID,
    LOCKED_BY_ID,
    TYPE_ID
)
VALUES 
(
    :P_ak_TITLE,
    :P_al_LAST_CHANGE_ID,
    :P_am_EFFECTIVE_DATE,
    :P_an_CREATE_DATE,
    :P_ao_BO_REFRENCE_ID,
    :P_ap_CREATOR_ID,
    :P_aq_COMPANY_ID,
    :P_ar_VOUCHER_ID,
    :P_as_TRANSACTION_TYPE_VALUE,
    :P_at_FISCAL_YEAR_ID,
    :P_au_TRANSACTION_STATE_VALUE,
    :P_av_FYTB_ID,
    :P_aw_REVISORY_TRANSACTION_ID,
    :P_ax_BO_TYPE_VALUE,
    :P_ay_TRANSACTION_NUMBER,
    :P_az_ID,
    :P_ba_LOCKED_BY_ID,
    :P_bb_TYPE_ID
);

END;

FYI, I'm using ODP.NET . 仅供参考,我正在使用ODP.NET

Why this exception is being thrown for such query? 为什么要为此类查询抛出此异常?

Update 1: Before this problem I've confronted such problem before and following hints resolved them. 更新1:在此问题出现之前,我已经在提示解决之前和之后遇到了这样的问题。 But in this case, these hint's doesn't work. 但在这种情况下,这些提示不起作用。

  • Removing all "\\n" , "\\r" , "\\t" characters from the query. 从查询中删除所有"\\n""\\r""\\t"字符。
  • Renaming all variables with a name longer that 31 characters. 使用长度超过31个字符的名称重命名所有变量。

Maybe it's because ODP.NET doesn't support the '\\r' character in some situations... Try to remplace 也许是因为在某些情况下ODP.NET不支持'\\ r'字符...尝试重新加入

command.ExecuteNonQuery();

by 通过

command.CommandText = command.CommandText.Replace("\r", string.Empty);
command.ExecuteNonQuery();

You should post the rest of your .net code, specifically the parameters you're adding to the command. 您应该发布.net代码的其余部分,特别是您要添加到命令中的参数。 In any case I see a couple of potential problems: 在任何情况下,我都会看到一些潜在的问题:

One, maybe toad is doing something special, but the following is not valid in a sql-plus window: 一,也许toad正在做一些特别的事情,但以下在sql-plus窗口中无效:

declare vv2 number ; 
BEGIN 
:vv := '';
end;
/

Bind variables with the colon are actually declared in the sql-plus "var" statement, not in the declare statement of the anonymous pl-sql block. 使用冒号绑定变量实际上是在sql-plus“var”语句中声明的,而不是在匿名pl-sql块的declare语句中声明。 It doesn't look like you're using that variable anyway. 无论如何,它看起来并不像你在使用那个变量。 This alone could be the problem since it's throwing off the number of parameters that need to be bound. 仅此一点可能是问题,因为它丢弃了需要绑定的参数数量。

Two, this might be a typical parameter missmatch issue (again, need to see your Parameter.Add calls). 二,这可能是一个典型的参数失配问题(同样需要查看你的Parameter.Add调用)。 Could be mismatched number of params, parameter type, parameter order, etc. Please refer to a previous blog post of mine. 可能是参数类型,参数类型,参数顺序等不匹配的数量。请参阅我之前的博文

Last, I've not tried to execute two anonymous blocks in one statement. 最后,我没有尝试在一个语句中执行两个匿名块。 Maybe try one at a time just to rule them out? 也许一次尝试一个只是为了排除它们? I've also have an in-depth write up of calling sql-plus scripts. 我还深入编写了调用sql-plus脚本的文章。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM