0

oracle如何在一个存储过程中调用另一个返回游标的存储过程

by 刘武 24. 六月 2009 21:24

实际项目当中经常需要在一个存储过程中调用另一个存储过程返回的游标,本文列举了两种情况讲述具体的操作方法。

第一种情况是返回的游标是某个具体的表或视图的数据,如:

CREATE OR REPLACE PROCEDURE P_TESTA (
PRESULT OUT SYS_REFCURSOR
)
AS
BEGIN
 OPEN PRESULT FOR SELECTFROM USERS;
END P_TESTA;
其中USERS就是数据库中一个表。在调用的时候只要声明一个该表的ROWTYPE类型就可以了:

CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
R USERS%ROWTYPE;
BEGIN
      P_TESTA(VARCURSOR);
      LOOP
       FETCH VARCURSOR INTO R;
       EXIT WHEN VARCURSOR%NOTFOUND;
       DBMS_OUTPUT.PUT_LINE(R.NAME);
      END LOOP;
 END P_TESTB;

第二种情况,我们返回的不是表的所有的列,或许只是其中一列或两列,如:

CREATE OR REPLACE PROCEDURE P_TESTA (
PRESULT OUT SYS_REFCURSOR
)
AS
BEGIN
 OPEN PRESULT FOR SELECT ID,NAME FROM USERS;
END P_TESTA;
这里我们只返回了USERS表的ID,NAME这两个列,那么调用的时候也必须做相应的修改:

CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
CURSOR TMPCURSOR IS SELECT ID,NAME FROM USERS WHERE ROWNUM=1;
R TMPCURSOR%ROWTYPE;
BEGIN
 P_TESTA(VARCURSOR);
    LOOP
     FETCH VARCURSOR INTO R;
        EXIT WHEN VARCURSOR%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(R.ID);
    END LOOP;
 END P_TESTB;
与之前不同的是我们声明了一个游标类型的变量TMPCURSOR ,注意TMPCURSOR 的结构必须与存储过程P_TESTA 返回的游标结构一致,否则就会出现错误。同理只要保持两个游标类型结构一致,就可以实现自由调用。

Tags: , ,

技术生涯

0

如何将类库里Web服务配置节的内容移到主程序中

by 刘武 18. 六月 2009 21:12

项目中需要在数据访问层中添加Web引用,因此系统会在该类库中自动生成一个APP.CONFIG文件,里面包含了Web服务的地址。可惜的是,如果在主程序中添加对该类库的引用,系统并不会帮你生成该类库的配置节,那么如何在主程序中配置类库中的内容呢? 其实很简单,只要将类库的APP.CONFIG中的相关内容复制到主程序中即可。如以下是数据访问层DataAccess的APP.CONFIG文件中的内容:


<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="DataAccess.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <DataAccess.Properties.Settings>
      <setting name="DataAccess_Liuwu_Net_WebService" serializeAs="String">
        <value>http://liuwu.net:9823/AJAXEnabledWebSite1/WebService.asmx</value>
      </setting>
    </DataAccess.Properties.Settings>
  </applicationSettings>
</configuration>

我们只要将其中的sectionGroup和applicationSettings的内容复制到主程序的APP.CONFIG文件中即可,以下是主程序的APP.CONFIG:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="DataAccess.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <DataAccess.Properties.Settings>
      <setting name="DataAccess_Liuwu_Net_WebService" serializeAs="String">
        <value>http://liuwu.net:9823/AJAXEnabledWebSite1/WebService.asmx</value>
      </setting>
    </DataAccess.Properties.Settings>
  </applicationSettings>
  <appSettings>
    <add key="Hello" value="1234"/>
  </appSettings>
</configuration>

同理,如果还有其他类似的项目,只要将相关的配额节追加到主程序的APP.CONFIG文件中即可。

Tags: ,

技术生涯

0

SoapHeader实践之客户端验证

by 刘武 9. 六月 2009 21:00

编写Webservice时经常需要对用户的身份进行认证,我们可以给用户一个令牌,然后在每个方法签名中增加该令牌做为参数,以此来验证用户的合法性。但这杨就必须修改所有的方法签名,很显然是难以维护的。因此我们要尽量避免修改方法签名,而使用SoapHeader恰好可以满足我们的需求,通过将令牌保存在SoapHeader类中来实现在客户端和服务端的传送。以下是具体的操作流程:

一 自定义SoapHeader类

public class MyHeader :SoapHeader
{
    public MyHeader() { }

    private string _token = "";
    public string Token
    {
        get { return _token; }
        set { _token = value; }
    }
}

注意一定要继承SoapHeader

二 编写Webservice

[WebService(Namespace = "http://www.liuwu.net/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
    public MyHeader header;
  
    [WebMethod]
    [SoapHeader("header")]
    public bool IsRightUser()
    {
        return CheckToken();
    }

    /// <summary>
    /// 验证令牌
    /// </summary>
    /// <remarks>
    ///此处仅供演示,根据实际情况可添加更加复杂的验证过程
    ///</remarks>
    /// <returns></returns>
    private bool CheckToken()
    {
        if (header != null && header.Token == "123")
        {
            return true;
        }

        return false;
    }
}

我们声明了MyHeader类的实例header,并且在IsRightUser函数中增加了SoapHeader属性,指明使用header来保存他的值。

三 客户端调用

新建winform应用程序,并添加web引用,引用名为:SoapHeaderTest,具体调用方法如下

SoapHeaderTest.MyHeader header =
 new SoapHeaderTest.MyHeader();
header.Token = "123";
SoapHeaderTest.WebService ws =
 new SoapHeaderTest.WebService();
ws.MyHeaderValue = header;
bool b = ws.IsRightUser();
注意必须给ws的MyHeaderValue赋值

Tags: , ,

技术生涯

2

asp.net中cookie的处理

by 刘武 1. 六月 2009 22:14

使用中发现用Request.Cookies.Remove()无法删除cookie,google了一下发现一般是通过将过期时间设置成过去的时间来完成删除的。顺便整理下cookie的操作:

一 创建

1 单值的创建

HttpCookie hc = new HttpCookie("Value");

hc.Value = "value";

Response.AppendCookie(hc);

2 多值的创建

HttpCookie hc = new HttpCookie("Value");

hc["Value1"] = "value1";

hc["Value2"] = "value2;

Response.AppendCookie(hc);

二 读取

1 单值的读取

string value = Request.Cookies["Value"].Value;

2 多值的读取

string value1 = Request.Cookies["Value"]["Value1"].ToString();

string value2 = Request.Cookies["Value"]["Value2"].ToString();

三 删除

HttpCookie hc = Request.Cookies["Value"];

hc.Expires = DateTime.Now.AddDays(-1);

//下面这句一定要加上,否则无法删除

Response.AppendCookie(hc);

Tags: ,

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft