Delphi函数简介
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi函数简介相关的知识,希望对你有一定的参考价值。
参考技术A 跳转语句ObjectPascal的跳转语句有if和case两个。if语句if语句会计算一个表达式,并根据计算结果决定程序流程。在上文的例程中,根据ColorDialog.Execute的返回值,决定窗体的背景颜色。if保留字后跟随一个生成Boolean值True或False的表达式。一般用“=”作为关系运算符,比较产生一个布尔型值。当表达式为True时,执行then后的语句。否则执行else后的代码,if语句也可以不含else部分,表达式为False时自动跳到下一行程序。if语句可以嵌套,当使用复合语句表达时,复合语句前后需加上begin…end。else保留字前不能加“;”,而且,编译器会将else语句视为属于最靠近的if语句。必要时,须使用begin…end保留字来强迫else部分属于某一级的if语句。 参考技术B 程序程序代码在调用一个过程或函数时,通常用参数传递数据到被调用的过程或函数中。最常用的参数有数值参数、变量参数和常量参数三种。由被调用过程或函数定义的参数为形参,而由调用过程或函数指明的参数叫实参。在NoValue函数中,说明函数体中的AnEditBox是形参,而调用时在ifNoValue(Edit1)…中,Edit1是实参。数值参数在运行过程中只改变其形参的值,不改变其实参的值,即参数的值不能传递到过程的外面。试看下面的例程:procedureCalculate(CalNo:Integer);beginCalNo:=CalNo*10;end;用以下例程调用Calculate函数:Number:=StrToInt(Edit1.Text);Calculate(Number);Edit2.Text:=IntToStr(Number);Number接受由编辑框1输入的数值,经Calculate过程运算。它是一个数值型实参。在进入Calculate函数后,会把Number实参拷贝给形参CalNo,在过程中CalNo增大十倍,但并未传递出来,因此Number值并未改变,在编辑框2中显示仍然是编辑框1中的输入值。形参和实参占用不同的内存地址,在过程或函数被调用时,将实参的值复制到形参占用的内存中。因此出了过程或函数后,形参和实参的数值是不同的,但实参的值并不发生变化。如果您想改变传入的参数值,就需要使用变量参数,即在被调用程序的参数表中的形参前加上保留字var。例如:procedureCalculate(varCalNo:Integer);则CalNo并不在内存中占据一个位置,而是指向实参Number。当一个变参被传递时,任何对形参所作的改变会反映到实参中。这是因为两个参数指向同一个地址。将上一个例程中过程头的形参CalNo前面加上var,再以同样的程序调用它,则在第二个编辑框中会显示计算的结果,把第一个编辑框中的数值放大十倍。这时形参CalNo和实参Number的值都是Nnmber初始值的10倍。如果当过程或函数执行是要求不改变形参的值,最保险的办法是使用常量参数。在参数表的参数名称前加上保留字const可以使一个形参成为常量参数。使用常量参数代替数值参数可以保护您的参数,使您在不想改变参数值时不会意外地将新的值赋给这个参数。如何从 Delphi 调用 Oracle 函数?
【中文标题】如何从 Delphi 调用 Oracle 函数?【英文标题】:How can I call an Oracle function from Delphi? 【发布时间】:2011-02-26 15:10:48 【问题描述】:我在 Oracle 中创建了一个函数,用于在特定表中插入记录并根据函数内发生的情况返回输出。例如(ins_rec 返回编号)
如何调用此函数并在 Delphi 中查看其输出?
我收到了关于 sql plus 的回复(非常感谢),但我需要知道如何在 Delphi 中执行此操作
【问题讨论】:
欢迎来到***!您可以通过将答案标记为正确来向回答问题的人表示感谢。点击答案旁边的绿色勾号。恐怕我无法帮助您解决这个问题 - 我对德尔福一无所知。 :) 【参考方案1】:只需在查询中将用户定义的函数作为列名传递即可。
例子:
Var
RetValue: Integer;
begin
Query1.Clear;
Query1.Sql.Text := 'Select MyFunction(Param1) FunRetValue from dual';
Query1.Open;
if not Query1.Eof then
begin
RetValue := Query1.FieldByName('FunRetValue').AsInteger;
end;
end;
【讨论】:
Oracle 有 DUAL 特殊表,当您需要这样的东西时可以使用。您的代码可能无法执行您所期望的 - 它可以为如何实现它可能取决于您使用的 DB 访问库(BDE?dbExpress?ADO?其他),有些可能会提供一个“存储过程”组件,它也可以与函数一起使用。
使用匿名 PL/SQL 块调用函数(以及读取返回值的参数)的一般方法,PL/SQL 与 Pascal 非常相似...:
Qry.SQL.Clear;
Qry.SQL.Add('BEGIN');
Qry.SQL.Add(' :Rez := ins_rec;');
Qry.SQL.Add('END;');
// Set the parameter type here...
...
Qry.ExecSQL;
...
ReturnValue := Qry.ParamByName('Rez').Value;
不过,我不会使用函数,而是使用具有 OUT 值的存储过程。此外,Oracle 提供了包,它们是组织过程和函数的一种非常好的方式,它们还提供了有用的特性,如会话变量和初始化/终结部分......非常类似于 Delphi 单元。 p>
【讨论】:
【参考方案3】:我们使用此代码运行 Oracle 存储过程,该代码利用了 BDE(我知道请不要 bash,因为我们使用了 BDE!)
Try
DMod.Database1.Connected:= False;
DMod.Database1.Connected:= True;
with DMod.StoredProc1 do
begin
Active:= False;
ParamByName('V_CASE_IN').AsString:= Trim(strCaseNum);
ParamByName('V_WARRANT_IN').AsString:= strWarrantNum;
ParamByName('V_METRO_COMMENTS').AsString:= strComment;
Prepare;
ExecProc;
Result:= ParamByName('Result').AsString;
end;
Except
【讨论】:
以上是关于Delphi函数简介的主要内容,如果未能解决你的问题,请参考以下文章