据我所知,它只能为程序而不是函数提供OUT或IN OUT参数.但是,在定义用户定义的聚合函数时,我发现了这个签名:
member FUNCTION ODCIAggregateIterate(self IN OUT DeviationImpl,
value IN NUMBER) RETURN NUMBER
Run Code Online (Sandbox Code Playgroud)
这似乎是一个函数,但它有一个IN OUT参数.有人可以解释一下为什么这可能吗?
谢谢
是一种更好,更短的方式来执行此代码:
/*Replace all letters by their respective ASCII code - 55*/
as_iban := REPLACE(as_iban, 'A', '10');
as_iban := REPLACE(as_iban, 'B', '11');
as_iban := REPLACE(as_iban, 'C', '12');
as_iban := REPLACE(as_iban, 'D', '13');
as_iban := REPLACE(as_iban, 'E', '14');
as_iban := REPLACE(as_iban, 'F', '15');
as_iban := REPLACE(as_iban, 'G', '16');
as_iban := REPLACE(as_iban, 'H', '17');
as_iban := REPLACE(as_iban, 'I', '18');
as_iban := REPLACE(as_iban, 'J', '19');
as_iban := REPLACE(as_iban, 'K', '20');
as_iban := REPLACE(as_iban, 'L', '21');
as_iban := REPLACE(as_iban, 'M', '22');
as_iban := REPLACE(as_iban, 'N', …Run Code Online (Sandbox Code Playgroud) 我在Oracle中遇到了麻烦.我有一些这样的程序:
create or replace procedure myschema.DataSave(v_value IN NUMBER)
as
begin
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
begin
insert/update/delete...
exception when OTHERS then goto error;
end;
COMMIT;
return;
<<error>>
ROLLBACK;
return;
end;
/
Run Code Online (Sandbox Code Playgroud)
我以这种形式从c#项目调用此过程:
...
string conn_str = "...";
OracleConnection con = new OracleConnection(conn_str);
con.Open();
OracleCommand cmd = new OracleCommand("", con);
try
{
cmd.Transaction = cmd.Connection.BeginTransaction();
for (int i = 0; i < 10; i++)
{
// this condition simulates incorrect situations
if (i == 5)
{
throw new Exception("Something is …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中实现了某个功能,用户可以通过按下按钮并在此处插入一些值来动态地从用户界面编写查询.
用户根本不会看到生成的SQL语句.
我想知道是否有办法可以检查语法和语法(例如,他打开了动态生成的SQL的'parantheses'('并且忘了关闭它')以确保在实际执行之前不会发生运行时编译错误声明使用EXECUTE IMMEDIATE.
我试过这个:
update MESSAGE set TEXT = 'The following ' || CHAR(13) || CHAR(10) || 'has been disapproved'
where TITLE = 'REQUEST_DISAPPROVED';commit;
Run Code Online (Sandbox Code Playgroud)
和:
DECLARE
msg VARCHAR2 := 'The following ' || CHAR(13) || CHAR(10) || 'has been disapproved';
BEGIN
update MESSAGE set TEXT = :msg
where TITLE = 'REQUEST_DISAPPROVED';
END;
Run Code Online (Sandbox Code Playgroud)
和:
var this_is_a_variable varchar2(3000);
exec :this_is_a_variable := 'The following ' || CHAR(13) || CHAR(10) || 'has been disapproved';
update MESSAGE set TEXT = :this_is_a_variable where TITLE = 'REQUEST_DISAPPROVED';
Run Code Online (Sandbox Code Playgroud)
每个都会出现各种错误,我相信这只是一个语法问题.最终目标是当从此消息生成纯文本电子邮件时,它将适当地放置换行符.
这可能吗?
在Oracle Database PL/SQL语言参考11g第2版(11.2)文档中,"隐式回滚"部分以此文本开头:
"在运行INSERT,UPDATE,DELETE或MERGE语句之前,数据库标记一个隐式保存点(对您不可用).如果语句失败,数据库将回滚到保存点.通常,只会回滚失败的SQL语句,不是整个交易."
因此,如果我将一个SQL语句运行到PL/SQL程序中,并且句子失败,那么该句子将自动回滚.那没问题.
但同一部分以本文结尾:
"如果退出存储的子程序时出现未处理的异常,PL/SQL不会为OUT参数赋值,也不会进行任何回滚."
它似乎与第一个文本相反:如果我的程序以未捕获的异常结束,则不执行回滚.但是第一篇文章说如果SQL语句失败,则会自动完成回滚.
因此,如果我的存储程序包含一个SQL语句,句子失败,异常没有被捕获,我的程序结束,那么SQL语句应该回滚吗?该文件是否有矛盾?
Stack Overflow中的相关问题:
更新(已解决):感谢DrabJay的示例,现在更清楚了:
失败的SQL语句的回滚总是完成(无论是否进入程序).程序的回滚取决于调用者:
如果程序是一个匿名块(无来电显示存在),它相当于从用户的语句被调用,而一个失败的用户语句回自动回滚,所以匿名块被回滚.
我认为该文件应该更清楚,特别是"并且不做任何回滚"这两个词:
"如果退出存储的子程序时出现未处理的异常,PL/SQL不会为OUT参数赋值,也不会进行任何回滚."
我不确定为什么此代码会出现此错误,请帮助我调试此代码。
declare
type emp_t is table of employees%rowtype
index by pls_integer;
rec emp_t;
begin
select employee_id,salary,manager_id bulk collect into rec
from employees where rownum <100;
forall i in 1..rec.last
update employees
set salary=salary+10
where employee_id=rec(i).employee_id;
end;
ORA-06550: line 7, column 3:
PL/SQL: ORA-00913: too many values
ORA-06550: line 6, column 3:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Run Code Online (Sandbox Code Playgroud)
我已将代码更改为以下格式,但仍给我“表达式类型错误”
declare
type emp_t is table of employees%rowtype
index by pls_integer; …Run Code Online (Sandbox Code Playgroud) 基于这个答案,我试图创建临时表,但是我得到异常ORA-00942:table or view does not exist我会认为'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS'语句有问题,它失败了insert into TempQandA(column1) VALUES (1);.
请在下面找到SQL语句.
DECLARE
TransactioDetailId numeric := 3132;
HomePhoneNumber varchar(20);
MobileNumber varchar(20);
Email varchar(20);
whatever varchar(20);
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';
BEGIN
SELECT contactvalue into HomePhoneNumber FROM customercontact CC
inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
inner join transactiondetail td on td.transactionid …Run Code Online (Sandbox Code Playgroud) 为了实现密码复杂性,我需要一个可以删除重复字符的函数(为了生成符合密码复杂性要求的密码).因此,不再允许像weeeeee1这样的字符串,因为重复了e.我需要一个函数,它将返回we1,其中重复的字符已被删除.必须使用Oracle PL/SQL或直接sql.
我发现Oracle SQL - 从字符串中删除部分重复,但这不适用于我的weeeeee1测试用例,因为它只替换了一次迭代,因此返回weee1.
我不是要测试没有重复的字符.我正在尝试将重复的字符串更改为非重复的字符串.