我尝试在Oracle服务器上创建SQL过程。这是我的代码,
private const string InsertCallProc =
@"CREATE OR REPLACE PROCEDURE INSERTCALL (Id in varchar2,No in varchar2,
Surname in varchar2, Name in varchar2, CallType in varchar2,
CallDate in date, CallNo in varchar2, VoiceNetwork in varchar2,
Type in varchar2,TalkTime in number,PriceWithDiscount in number,
PriceWithoutDiscount in number, LmTime in date)
AS
BEGIN
INSERT INTO TMOBILE_R_CALLS (ID,NO,SURNAME,NAME,CALL_TYPE,CALL_DATE,CALL_NO,
VOICE_NETWORK, TYPE,TALK_TIME, PRICE_WITH_DISCOUNT, PRICE_WITHOUT_DISCOUNT,LM_TIME)
VALUES(Id, No, Surname, Name, CallType,CallDate, CallNo, VoiceNetwork,Type, TalkTime,
PriceWithDiscount,PriceWithoutDiscount, LmTime);
END;";
执行此sql cmd的方法,输入参数为InsertCallProc
字段。
private void ExecuteNonQueryCmd(string cmdText)
{
using (var conn = new OracleConnection(GenerateConnectionString()))
{
conn.Open();
var cmd = new OracleCommand
{
Connection = conn,
CommandText = cmdText
};
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
}
}
如果我调用此方法,则会创建该过程。但是,如果我检查PL / SQL开发人员的程序,我会看到:
PROCEDURE SYSTEM.INSERTCALL的编译错误
错误:PLS-00103:遇到其中一个符号时遇到符号“” 以下:
当前行:1文本:创建或替换程序INSERTCALL(Id in varchar2,varchar2中的否,
我认为这是由在C#代码中格式化字符串引起的。因为如果我在Oracle服务器上执行相同的SQL代码,则创建过程没有问题。
这个问题的解决方案是什么?
答案 0 :(得分:2)
这可能是由于命名。您有一个名为Type
的参数和一列,根据此page,它是一个保留字。
我也非常不愿意为列提供相同的参数名称。我会在参数前加上in
或类似名称,因此我会使用inId
而不是Id
。
总而言之,我建议测试它的一种方法是更改代码以创建一个没有参数的非常基本的过程,什么都不做,看看是否有效,如果有的话,那就添加一个参数等,直到它破裂。
答案 1 :(得分:1)
也许是你的C#字符串中嵌入的换行符。错误
在期待下列其中一项
时遇到符号“”
向我表明,有一个特殊字符无法打印。它也表明问题出在第一行。
此外,在SYSTEM或SYS模式中创建对象通常是个坏主意。
至于指向保留字使用的答案:虽然这不是一个很好的做法,但它可能不是罪魁祸首:
SQL> CREATE OR REPLACE PROCEDURE p(TYPE IN VARCHAR2) IS
2 BEGIN
3 dbms_output.put_line(TYPE);
4 END;
5 /
Procedure created
SQL> DECLARE
2 BEGIN
3 p('This is a test');
4 END;
5 /
This is a test
PL/SQL procedure successfully completed
SQL>
答案 2 :(得分:0)
我认为你错了这个结论:
因为如果我在Oracle服务器上执行相同的SQL代码程序是 创造没有问题。
创建的程序没有错误,然后编译错误 - 但是默默地。
如果您在创建程序后立即使用sqlplus或sqlplusw执行SHOW ERRORS
命令。
如果您使用PL/SQL Developer,TOAD,SQL Navigator或SQL Developer等高级开发工具,只需在专用编辑器窗口中打开已创建的函数,然后尝试在此处进行编译。您必须看到相同的编译错误。
在任何情况下,您都必须修复过程代码中的一些错误:使用保留字(type
)作为参数名称等等。
答案 3 :(得分:0)
请你回答,问题是在C#中格式化字符串。我解决了这个问题:
public static string CreateInsertCallProc =
"CREATE OR REPLACE PROCEDURE INSERTCALL (inId in varchar2,inSimCard in varchar2,\n" +
"inSurname in varchar2, inName in varchar2, inCallType in varchar2,\n" +
"inCallDate in date, inCallNo in varchar2, inVoiceNetwork in varchar2,\n" +
"inTimeType in varchar2,inTalkTime in number,inPriceWithDiscount in number,\n" +
"inPriceWithoutDiscount in number, inLmTime in date)\n" +
"AS\n" +
"BEGIN\n" +
"INSERT INTO TMOBILE_R_CALLS (ID,SIM_CARD,SURNAME,NAME,CALL_TYPE,CALL_DATE,CALL_NO,\n" +
"VOICE_NETWORK, TIME_TYPE,TALK_TIME, PRICE_WITH_DISCOUNT, PRICE_WITHOUT_DISCOUNT,LM_TIME)\n" +
"VALUES(inId, inSimCard, inSurname, inName, inCallType, inCallDate, inCallNo, inVoiceNetwork,\n" +
" inTimeType, inTalkTime,inPriceWithDiscount,inPriceWithoutDiscount, inLmTime);\n" +
"END;";
此外,我将columne名称从Type更改为Time_Type,并从架构系统
移动表