造成这个问题的原因是参数变量名称与Where条件字段名相同导致冲突
报错的代码
错误原因:因为我的参数sno 和搜索的字段名SNO 一样 (不能一样)
CREATE OR REPLACE
PROCEDURE "serchS" (sno IN VARCHAR2)
AS
v_name varchar2(20);
v_age varchar2(20);
BEGIN
SELECT SNAME INTO v_name FROM S WHERE SNO = sno;
DBMS_OUTPUT.PUT_LINE(v_name);
END;
/*--------------------------------------------------------------------------*/
改正后的代码
CREATE OR REPLACE
PROCEDURE "serchS" (sno2 IN VARCHAR2) //改变了变量名
AS
v_name varchar2(20);
v_age varchar2(20);
BEGIN
SELECT SNAME INTO v_name FROM S WHERE SNO = sno2; //改变了变量名
DBMS_OUTPUT.PUT_LINE(v_name);
END;
原文链接:
https://blog.csdn.net/c1481118216/article/details/71404388
Url重写系列篇:
----主讲:天涯浪子
本讲将通过实例比较ASP.NET下的三种典型URL重写方案——ISAPI重写(使用开源组件IIRF),ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中可能遇到的陷阱及处理办法。
需要手动为UrlRewriteWebSite目录添加一个到http://localhost/UrlRewriteWebSite的同名虚拟目录,允许匿名访问,并设置目录默认页为default.aspx。
另外,为了启用IIRF的URL重写支持,需要将UrlRewriteWebSite/bin目录下的IsapiRewrite4.dll添加为IIS默认网站的ISAPI过滤器。[相应资料打压缩包]
重写原理:
用户(A)----->系统运行(C)
真实地址 用真实地址运行
注意,我们的演示程序中将混合使用三种方式的URL重写,因此,需要为三种实现分别设置一些URL重写规则:
1、IIRF,对于IIRF,对应于IsapiRewrite4.dll,在相同的目录会有一个IsapiRewrite4.ini文件,除了默认的一些设置,我们在文件末尾添加了几条自定义规则如下:
# Custom RewriteRules
RewriteRule ^/UrlRewriteWebSite/test(.*).aspx /UrlRewriteWebSite/Default.aspx?page=$1
RewriteRule ^/UrlRewriteWebSite/folder/(.*).aspx /UrlRewriteWebSite/Default.aspx?folder=$1
RewriteRule ^/UrlRewriteWebSite/folder/? /UrlRewriteWebSite/Default.aspx?folder=default
熟悉正则表达式的朋友应该很容易理解上面这三条规则。
规则一将形如testXXX.aspx这样的页面访问,重写为Default.aspx?page=XXX这样的页面;
规则二将形如folder/XXX.aspx的路径,重写为Default.aspx?folder=XXX这样的页面;
规则三将不带任何文件的folder目录的访问,重写为Default.aspx?folder=default这样的页面。
2、urlMappings是ASP.NET2.0内置支持的URL重写配置块,它应该包含在web.config的<system.web>配置块中。但是,这个内置的URL重写支持不支持正则表达式,因而只能用来实现一对一的路径和页面的重写。urlMappings的配置内容包含在下面的Web.config文件中。
3、NBear.Web.Modules.UrlRewriteModule则是NBear中实现的一个基于HTTPModule的URL重写实现,它允许使用正则表达式来描述重写规则。
注意,代码中包含了urlMappings配置和用于NBear.Web.Modules.UrlRewriteModule重写规则。为了比较着几种重写方案,正则表达式基本上是和前面的IIRF定义中的规则类似的。
定义完这些重写规则,我们就可以试着在页面中使用它们了。例如,如果我们写一个测试页面如下:
Default.aspx
public partial class _Default : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
Response.Write(Request.Path + "?" + Request.ServerVariables["QUERY_STRING"]);
注意,Default.aspx页面会输出当前呈现的
实际
页面及其QueryString参数。
运行该页面,分别点击页面中的链接,我们会看到,貌似所有的URL重写一切正常。但是,当试着点击页面中的按钮,我们马上会发现,页面postback后,浏览器地址栏中的链接变成了那个被重写后的地址,而不是,原来显示于地址栏的虚拟地址了。这是一个严重的不一致,没道理我点击页面的按钮,在没有跳转到其他页面的情况下,地址栏显示另一个页面地址,不是吗?
要解决这个问题,我们只需要为form添加一个onsubmit事件处理如下:
<form id="form1" runat="server" onsubmit="this.action=document.location.href">
添加该事件处理,就能在页面postback提交之前,重置页面的地址。
为前面的页面添加onsubmit之后,我们发现,postback不再会改变地址栏地址显示了。
注意:你确认试过点击最后一组链接中的buildin default page和section default page了吗?
你会发现,这两个链接根本不能显示。为什么呢?为什么类似的folder default page可以正常显示,而另两个不能显示呢?
回到前面的规则定义部分,我们就能发现,folder default page使用的是由IIRF这个ISAPI定义的规则,而另两个则使用的是内置于ASP.NET2.0的HTTPModule的重写规则(本质上,urlMappings也是使用HTTPModule来实现重写的,所以,除了不支持正则表达式之外,它也包含自定义HTTPModule方式实现的所有缺点)。
在IIS的ISAPI层面,是可以截获所有的页面
请求
的,哪怕指定的页面、目录根本不存在。但是,ASP.NET解析器则只有在对页面的
请求
被IIS转发过来时,才能处理。我们知道,IIS可以忽略对链接的虚拟目录是否存在的检测,但是,却无法检测非ASP.NET支持的文件扩展名的链接(我们固然可以在IIS中将所有类型的扩展名都映射到ASP.NET解析器,但是,如果我们有设置IIS的权限,为什么还要用性能更低,限制更多的ASP.NET方式的URL重写,而不使用基于ISAPI方式的重写呢?)。所以,为了让这两个不能显示的页面能正常显示,一方面,我们要在IIS中设置默认页,如default.aspx,另一方面,需要让IIS对某个不带aspx扩展名的链接,如这里只包含某个目录的名称的链接转发到默认页。
要做到这一点,我们需要在我们的应用程序中,为buildin和section分别将两个对应的目录,并且,在目录中创建两个空的default.aspx页面。尽管这样的default.aspx页面
实际
上永远不会被真正执行,但是有他们的帮助,就能让IIS顺利地将页面
请求
转发至ASP.NET解析器,从而,使得基于HTTPModule的URL重写规则,被执行。
好了,创建这两个目录及default.aspx文件,我们就能修复该问题了。
接下来我们先做点测试:
我们来对页面上的链接反复点击点击,folder page -> section page -> folder page -> section page...等等,打住,看到浏览器地址栏发生了什么吗?这不是恐怖活动,但是。。。也差不多了。我们看到我们可爱的地址,变成了...folder/section/folder/section...aspx。
想想是为什么呢?看看我们的aspx文件。。。我想你一定想到了。对了,都是相对路径惹的祸!
我们可爱的的相对路径一顶是同学们最常使用的,但是,浏览器在处理相对路径时,是以浏览器上接受的url地址为基础进行计算的,也就是说,如果当前的地址为folder/1.aspx,那么,很显然,./section/2.aspx这个页面,对应的自然是folder/section/2.aspx了,问题就出在这儿了!没有URL重写时,不会有这样的情况出现。但是URL重写,并且,将一个带假目录的虚拟地址重写到一个不带假目录的页面时,由于浏览器客户端和服务端此时的当前页面计算方法是不同的,就会发生相对路径的匹配错误问题!真实很严重的问题啊!
解决的办法,只有使用绝对路径!但是,我们当然不会傻到对每个链接直接使用绝对路径的,呵呵:)
将Default.aspx中的所有相对路径都使用Page.ResolveUrl进行包装如下,在输出页面时就将地址转换为绝对路径,就能解决这个恐怖的相对路径陷阱了。当然,也别忘了加上onsubmit事件处理代码:
Default.aspx
参考资料:
让我们花点时间来看一下网站上的一些 URL。您是否发现一些类似于 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 的 URL?或者,您可能将一系列网页从一个目录或网站移动到另一个目录或网站,结果导致已将旧 URL 用作书签的访问者断开链接。在本文中,我们将了解如何通过将 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 替换为类似于 http://yoursite.com/people/sales/chuck.smith 的网址,使用 URL 重写将那些冗长的 URL 缩写为富有意义且容易记忆的 URL。我们还将了解如何将 URL 重写用于创建智能 404 错误。
URL 重写是截取传入 Web
请求
并自动将
请求
重定向到其他资源的过程。执行 URL 重写时,通常会检查被
请求
的 URL,并基于 URL 的值将
请求
重定向到其他 URL。例如,在进行网站重组而将 /people/ 目录下的所有网页移动到 /info/employees/ 目录中时,您可能希望使用 URL 重写来检查 Web
请求
是否指向了 /people/ 目录中的文件。如果
请求
指向 /people/ 目录中的文件,您可能希望自动将
请求
重定向到 /info/employees/ 目录中的同一文件。
使用传统的 ASP,应用 URL 重写的唯一方法是编写 ISAPI 筛选器,或者购买提供 URL 重写功能的第三方产品。但是,使用 Microsoft® ASP.NET,您可以通过很多方法来轻松地创建您自己的 URL 重写软件。本文讨论了可供 ASP.NET 开发人员实现 URL 重写的各种技术,然后讨论了 URL 重写的一些
实际
使用情况。在深入讨论 URL 重写的技术细节之前,让我们先看一些可以使用 URL 重写的日常情景。
URL 重写的常见用法
创建数据驱动的 ASP.NET 网站时,通常会产生一个单个的网页,该网页基于查询字符串参数显示数据库数据的子集。例如,在设计电子商务站点时,您的任务之一便是允许用户浏览待售产品。为此,您可以创建一个名为 displayCategory.aspx 的页面,该页面将显示给定类别的产品。可以通过查询字符串参数来指定要查看的该类别的产品。也就是说,如果用户要浏览待售的 Widget 产品,并且所有 Widget 产品的 CategoryID 均为 5,则用户可以访问以下网址:http://yousite.com/displayCategory.aspx?CategoryID=5。
创建具有此类 URL 的网站有两点不足:首先,从最终用户的角度考虑,URL http://yousite.com/displayCategory.aspx?CategoryID=5 比较杂乱。可用性专家 Jakob Neilsen 建议遵循以下标准来选择 URL:
• 简短。
• 易于键入。
• 可以看出站点的结构。
• “可删节”,允许用户通过删除 URL 的组成部分来浏览站点。
我还要增加一条标准,即,URL 应该便于记忆。URL http://yousite.com/displayCategory.aspx?CategoryID=5 不符合 Neilsen 的任何标准,也不容易记住。要求用户键入查询字符串值将使 URL 的键入变得非常困难,并且只有了解查询字符串参数的用途及其名称/值对结构的富有经验的 Web 开发人员才能够对 URL 进行“删节”。
较好的方法是允许使用切合
实际
且容易记忆的 URL,如 http://yoursite.com/products/Widgets。只要看一眼 URL,您便可以推断出将要显示的内容 -- 有关 Widget 的信息。此 URL 也很容易记住和共享。我可以告诉我的同事“请查看 yoursite.com/products/Widgets,”,她可能无需再次问我 URL 是什么即可打开该页面。(尝试一下,您只需说出“Amazon.com 页面”即可!)此 URL 还将显示出来,并且应该是“可删节”的。也就是说,如果用户删去 URL 的末端,键入 http://yoursite.com/products,他们应该看到所有产品的列表,或者至少应该看到他们可以查看的所有类别的产品列表。
注意:要获得“可删节”URL 的最好示例,可考虑使用由许多 blog 引擎生成的 URL。要查看 2004 年 1 月 28 日的帖子,用户可以访问诸如 http://someblog.com/2004/01/28 的 URL。如果该 URL 被删节为 http://someblog.com/2004/01,用户将看到 2004 年 1 月的所有帖子。将该 URL 进一步删节为 http://someblog.com/2004 将显示 2004 年的所有帖子。
除了简化 URL 之外,URL 重写还经常用于处理网站重组,以免导致大量链接断开或书签过期。
请求
到达 IIS 时将会发生什么情况
在正式研究 URL 如何实现重写之前,应首先了解 Microsoft® Internet Information Services (IIS) 如何处理传入
请求
,这一点非常重要。当
请求
到达 IIS Web 服务器时,IIS 检查被
请求
文件的扩展名以确定如何处理该
请求
。IIS 可以自行处理
请求
(如 HTML 页面、图像以及其他静态内容),或者将
请求
路由到 ISAPI 扩展。(ISAPI 扩展是一个处理传入 Web
请求
的非托管编译类。其任务是生成被
请求
资源的内容。)
例如,当传入针对 Info.asp 网页的
请求
时,IIS 会将此消息路由到 asp.dll ISAPI 扩展。然后,该 ISAPI 扩展将加载被
请求
的 ASP 页面,执行该页面,并将所呈现的 HTML
返回
给 IIS,然后,IIS 将该 HTML 发送回
请求
客户端。对于 ASP.NET 页面,IIS 会将此消息路由到 aspnet_isapi.dll ISAPI 扩展。然后,aspnet_isapi.dll ISAPI 扩展将处理操作传递给托管的 ASP.NET 辅助进程,该辅助程序将处理
请求
,并
返回
ASP.NET 网页的呈现 HTML。
您可以自定义 IIS,以指定扩展名与 ISAPI 扩展的映射关系。图 1 显示了 Internet Information Services 管理工具的“应用程序配置”对话框。请注意,与 ASP.NET 有关的扩展名(.aspx、ascx、config、asmx、rem、cs、vb 及其他)均已映射到 aspnet_isapi.dll ISAPI 扩展。
图 1. 已配置的文件扩展名映射
讨论 IIS 如何管理传入
请求
稍稍
超出
了本文范围。但是可以在 Michele Leroux Bustamante 的文章 Inside IIS and ASP.NET 中找到对此内容的深入讨论。ASP.NET 引擎仅处理那些扩展名已明确映射至 IIS 中的 aspnet_isapi.dll 的传入 Web
请求
,了解这一点非常重要。
使用 ISAPI 筛选器检查
请求
IIS 除了可以将传入 Web
请求
的文件扩展名映射到相应的 ISAPI 扩展之外,还将执行许多其他任务。例如,IIS 将尝试对发出
请求
的用户进行身份验证,并确定通过身份验证的用户是否有权限访问被
请求
的文件。在处理
请求
的有效期内,IIS 将经历几个状态。在每个状态下,IIS 都将引发可以使用 ISAPI 筛选器以编程方式进行处理的事件。
与 ISAPI 扩展一样,ISAPI 筛选器是在 Web 服务器上安装的非托管代码块。ISAPI 扩展被设计为可以响应针对特定文件类型的
请求
。另一方面,ISAPI 筛选器还包含可以对 IIS 引发的事件进行响应的代码。ISAPI 筛选器可以截取甚至修改传入和传出的数据。ISAPI 筛选器可以应用于很多方面,包括:
• 身份验证和授权。
• 记录和监视。
• HTTP 压缩。
• URL 重写。
虽然 ISAPI 筛选器可用于执行 URL 重写,但本文将讨论如何使用 ASP.NET 实现 URL 重写。不过,我们将对使用 ISAPI 筛选器与使用 ASP.NET 中的技术实现 URL 重写进行权衡。
请求
进入 ASP.NET 引擎时将会发生什么情况
在 ASP.NET 之前,需要使用 ISAPI 筛选器来实现 IIS Web 服务器上的 URL 重写。由于 ASP.NET 引擎与 IIS 非常相似,因此可以使用 ASP.NET 进行 URL 重写。存在相似之处的原因在于 ASP.NET 引擎可以实现以下功能:
• 在处理
请求
时可以引发事件。
• 允许任意数量的 HTTP 模块处理所引发的事件,这与 IIS 的 ISAPI 筛选器相似。
• 将呈现被
请求
资源这项任务委托给 HTTP 处理程序,该处理程序与 IIS 的 ISAPI 扩展相似。
与 IIS 一样,ASP.NET 引擎在
请求
的有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态。例如,当 ASP.NET 引擎首次响应
请求
时,BeginRequest 事件将被触发。接下来触发的是 AuthenticateRequest 事件,该事件在已建立用户标识时出现。(此外,还有大量的其他事件:AuthorizeRequest、ResolveRequestCache 和 EndRequest,等等。这些事件属于 System.Web.HttpApplication 类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplication Class Overview。)
正如上一部分所讨论的,可以创建 ISAPI 筛选器以响应 IIS 引发的事件。同样,ASP.NET 提供了 HTTP 模块,该模块可以响应由 ASP.NET 引擎引发的事件。可以将 ASP.NET Web 应用程序配置为具有多个 HTTP 模块。对于由 ASP.NET 引擎处理的每个
请求
,将初始化每个已配置的 HTTP 模块,并允许将事件处理程序绑定到处理
请求
期间所引发的事件。请注意,对每个
请求
均使用了许多内置 HTTP 模块。其中的一个内置 HTTP 模块是 FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。如果没有使用,会自动将用户重定向到指定的登录页面。
如上所述,通过使用 IIS,传入
请求
将最终发送给 ISAPI 扩展,而 ISAPI 扩展的任务是
返回
特定
请求
的数据。例如,在
请求
传统的 ASP 网页时,IIS 将
请求
传递给 asp.dll ISAPI 扩展,该扩展的任务是
返回
被
请求
的 ASP 页面的 HTML 标记。ASP.NET 引擎使用相似的方法。初始化 HTTP 模块后,ASP.NET 引擎的下一项任务是确定应由哪个 HTTP 处理程序来处理
请求
。
所有通过 ASP.NET 引擎传递的
请求
最终都将到达 HTTP 处理程序或 HTTP 处理程序工厂(HTTP 处理程序工厂仅
返回
HTTP 处理程序的实例,然后使用该实例来处理
请求
)。最终的 HTTP 处理程序将
返回
响应,即呈现被
请求
的资源。此响应将被发送回 IIS,然后 IIS 将响应
返回
给提出
请求
的用户。
ASP.NET 包括许多内置的 HTTP 处理程序。例如,PageHandlerFactory 用于呈现 ASP.NET 网页。WebServiceHandlerFactory 用于呈现 ASP.NET Web 服务的响应 SOAP 信封。TraceHandler 将向 trace.axd 呈现
请求
的 HTML 标记。
图 2 描述了如何处理对 ASP.NET 资源的
请求
。首先,IIS 接收到
请求
,并将
请求
调度给 aspnet_isapi.dll。接下来,ASP.NET 引擎对已配置的 HTTP 模块进行初始化。最后将调用正确的 HTTP 处理程序,并呈现被
请求
的资源,将所生成的标记
返回
给 IIS 和
请求
客户端。
图 2. IIS 和 ASP.NET 正在处理
请求
createorreplaceproceduredemo3(numoutnumber)as
avgsalaryvaluenumber;--存放平均工资
onesalaryvaluenumber;--存入员工平均工资
begin
num:=0;
selectavg(s.salaryvalue)intoavgsalaryvaluefromsalary...
首先要知道:select .....into 语句只能够查询一个记录的信息。 如果没有查到任何数据,会产生NO_DATA_FOUND异常; 如果查询到多个记录,则会产生TOO_MANY_ROWS异常。在这里很明显 “
ORA
-
01422
实际
返回
的
行数
超出
请求
的
行数
”就是第二种情况,查询到多个记录,所以就会报错,如果必须最后...
译者言:原文链接:https://medium.com/neo4j/cypher-query-optimisations-fe0539ce2e5c ,由于原文较长,分成两部分,第一部分介绍一下原理,第二部分介绍具体案例。本文为第二部分优化查询查询慢还有可能是cypher语句没有被优化,因此在开发中分析查询日志就会显得非常重要,在早期就可以帮助你发现一些低效的查询。查询优化的目标是尽可能降低数据库的...
2.
实际
返回
的
行数
超出
请求
的
行数
ORA
-06512:
原因:sql语句的条件出错
3.Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Mapper’s namespa...
在开发系统的时候,你可能经常需要计算一个表的
行数
,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条select count(*) from t 语句不就解决了吗?
但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。
那么今天,我们就来聊聊count(*)语句到底是怎样实现的,以...
题目keywordsCounting.cpp Define a function that, given an istream& and a const vector&, produces a map holding each string (keyword) and the numbers of the line on which the string appears. The ...
问题:在编写存储过程,执行的时候一直报这个错误,
ORA
-
01422
,应该是单行查询
返回
多个行。
解决方案:首先分析数据,有没有可能出现单行查询
返回
多个行的情况,对比了老半天,怎么看数据都不可能查出多行记录。最后百度了一下,发现可能是自己定义参数名称和表中的字段名称相同导致参数未传进去,进行了全表查询,所以查出了多条记录。最后修改自己定义的参数名称,问题解决。
备注:以后遇到这种问题,还是要早点...