标签: plsql

PL/SQL函数中的OUT/IN OUT参数

据我所知,它只能为程序而不是函数提供OUT或IN OUT参数.但是,在定义用户定义的聚合函数时,我发现了这个签名:

member FUNCTION ODCIAggregateIterate(self IN OUT DeviationImpl,
value IN NUMBER) RETURN NUMBER
Run Code Online (Sandbox Code Playgroud)

这似乎是一个函数,但它有一个IN OUT参数.有人可以解释一下为什么这可能吗?

谢谢

sql oracle plsql stored-procedures function

2
推荐指数
1
解决办法
8370
查看次数

用PL/SQL中的字符串替换每个字母的ASCII码

是一种更好,更短的方式来执行此代码:

/*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)

sql ascii plsql

2
推荐指数
1
解决办法
8927
查看次数

游标和视图有什么区别?

cursor和之间有什么区别view?因为它们都不会将数据存储在数据库中.

sql oracle plsql

2
推荐指数
1
解决办法
8509
查看次数

在oracle中使用"嵌套"事务

我在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)

c# oracle plsql transactions

2
推荐指数
1
解决办法
3469
查看次数

在执行之前在Oracle中测试本机动态SQL

我在我的应用程序中实现了某个功能,用户可以通过按下按钮并在此处插入一些值来动态地从用户界面编写查询.

用户根本不会看到生成的SQL语句.

我想知道是否有办法可以检查语法和语法(例如,他打开了动态生成的SQL的'parantheses'('并且忘了关闭它')以确保在实际执行之前不会发生运行时编译错误声明使用EXECUTE IMMEDIATE.

oracle plsql dynamic-sql

2
推荐指数
1
解决办法
985
查看次数

带有换行符的Oracle SQL VARCHAR列

我试过这个:

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 plsql

2
推荐指数
1
解决办法
8491
查看次数

PL/SQL:关于隐式回滚的Oracle文档中的矛盾

在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语句.
  • 另一件事是包含SQL语句的程序的回滚.

失败的SQL语句的回滚总是完成(无论是否进入程序).程序的回滚取决于调用者:

  • 如果回滚应用于调用方,则会对程序应用回滚.
  • 如果没有对调用者应用回滚,则不会对程序应用回滚.

如果程序是一个匿名块(无来电显示存在),它相当于从用户的语句被调用,而一个失败的用户语句回自动回滚,所以匿名块被回滚.

我认为该文件应该更清楚,特别是"并且不做任何回滚"这两个词:

"如果退出存储的子程序时出现未处理的异常,PL/SQL不会为OUT参数赋值,也不会进行任何回滚."

oracle plsql exception rollback

2
推荐指数
1
解决办法
758
查看次数

使用BULK COLLECT向集合分配多个列

我不确定为什么此代码会出现此错误,请帮助我调试此代码。

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)

oracle plsql

2
推荐指数
1
解决办法
9080
查看次数

EXECUTE IMMEDIATE oracle中的临时表未创建ORA-00942

基于这个答案,我试图创建临时表,但是我得到异常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)

sql oracle plsql oracle11g execute-immediate

2
推荐指数
1
解决办法
5041
查看次数

Oracle删除重复的字符

为了实现密码复杂性,我需要一个可以删除重复字符的函数(为了生成符合密码复杂性要求的密码).因此,不再允许像weeeeee1这样的字符串,因为重复了e.我需要一个函数,它将返回we1,其中重复的字符已被删除.必须使用Oracle PL/SQL或直接sql.

我发现Oracle SQL - 从字符串中删除部分重复,但这不适用于我的weeeeee1测试用例,因为它只替换了一次迭代,因此返回weee1.

我不是要测试没有重复的字符.我正在尝试将重复的字符串更改为非重复的字符串.

sql oracle plsql

2
推荐指数
1
解决办法
4461
查看次数