标签: plsql

使用dbms_utility.comma_to_table获取"xx.yy'附近的逗号分隔列表'无效"

我有这样的字符串:str:='ac_Abc.88,ac_Abc.99,ac_Abc.77'.我需要在用逗号(,)分割后得到第一个元素.所以即时使用像这样:

str VARCHAR2(500);
dbms_utility.comma_to_table
      ( list   => regexp_replace(str,'(^|,)','\1')
      , tablen => l_count
      , tab    => l_array
     ); 
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ORA-20001: comma-separated list invalid near bc.88
ORA-06512: at "SYS.DBMS_UTILITY", line 239
ORA-06512: at "SYS.DBMS_UTILITY", line 272
Run Code Online (Sandbox Code Playgroud)

但如果我有这样的字符串,str:='ac_Abc88,ac_Abc99,ac_Abc77',同样的方法工作正常并给我预期的结果.

所以我想有些东西需要纠正才能考虑"." 作为常规角色.你能建议我怎么解决这个问题.

sql oracle plsql string-split

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

是否可以从jdbc调用pl/sql函数并按名称注册返回值?

我可以使用以下语法的call语句调用pl/sql函数:

String call = "{ ? = call p_some_package.some_function( ?, ?, ?, ?, ?) }";
CallableStatement cs = connection.prepareCall(call);
Run Code Online (Sandbox Code Playgroud)

但是我必须使用它们的索引传递参数,因为我必须注册返回值,它没有名称:

cs.registerOutParameter(1, OracleTypes.NUMBER);
cs.setInt(2, someInteger);
...
Run Code Online (Sandbox Code Playgroud)

但是在调用过程时,我可以提供参数名称,因为没有"无名"out参数,因为有一个函数:

cs.setInt("param_name", param_value);
Run Code Online (Sandbox Code Playgroud)

Oracle pl/sql参考声明,对于函数,Oracle会创建一个返回的额外OUT参数.所以我的问题是:是否可以传递此参数的名称或以某种方式为此参数指定名称,并使用它将参数传递给JDBC中的pl/sql函数,就像我为程序做的那样?

类似的问题,没有答案: Java命名参数的名称(用于Oracle JDBC函数结果)

java oracle plsql jdbc oracle11g

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

在oracle中交换逗号分隔值

我有一个表,其中一列具有逗号分隔值,(例如:经度,纬度,经度1,纬度1等).

现在我需要交换像(纬度,经度,纬度1,经度1等)的值.

至于试用目的:我创建了一个表如下:

CREATE TABLE string_table
     (
          slno       NUMBER,
          old_string VARCHAR2(50),
          new_string VARCHAR2(50)
     );
/
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (1, '1,2,3,4,5,6');
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (2, '1,2,3,4,5');
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (3, 'a,b,c,d,e,f');
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (4, 'a,b,c,d,e');
COMMIT;
/
Run Code Online (Sandbox Code Playgroud)

现在表格如下:

slno  old_string  new_string                                         
----- ----------------------
1    1,2,3,4,5,6                                                                                           
2    1,2,3,4,5                                                                                             
3    a,b,c,d,e,f                                                                                           
4    a,b,c,d,e    
Run Code Online (Sandbox Code Playgroud)

我需要将交换的值更新为new_string列,结果应如下所示:

slno  old_string  new_string                                         
----- ----------------------
1    1,2,3,4,5,6    2,1,4,3,6,5
2    1,2,3,4,5      2,1,4,3,5
3    a,b,c,d,e,f    b,a,d,c,f,e
4    a,b,c,d,e …
Run Code Online (Sandbox Code Playgroud)

sql plsql oracle11g

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

检查行是否存在的最快方法

在a之前select SOMETHING into v_something,我想知道我的查询是否返回一行.

这是一个很好的方法,但select如果行存在,则成本为2 :

select count(1) into isRowExists from PERSON where CONDITION='Something';

if (isRowExists > 0) then
    select NAME into v_name from PERSON where CONDITION='Something';
else
    raise name_not_found;
end if;

select count(1) into isRowExists from CAR where CONDITION='Something';

if (isRowExists > 0) then
    select MODEL into v_model from CAR where CONDITION='Something';
else
    raise model_not_found;
end if;
Run Code Online (Sandbox Code Playgroud)

或类似的东西 :

select NAME into v_name from PERSON where CONDITION='Something';

select MODEL into v_model from CAR where CONDITION='Something'; …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

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

在case语句中返回一个布尔值

我试图从case语句返回一个布尔值,但编译器抱怨ORA-00936:缺少表达式错误:

SELECT
  CASE MYCOLUMN
     WHEN NULL THEN  true
  ELSE
       false
  END,
FROM MYTABLE;
Run Code Online (Sandbox Code Playgroud)

我也试过以下但它不起作用:

SELECT
  CASE MYCOLUMN
     WHEN NULL THEN  SELECT true
  ELSE
       SELECT false
  END,
FROM MYTABLE;
Run Code Online (Sandbox Code Playgroud)

是否有可能做到这一点?

oracle plsql

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

PLOP中的PL/SQL EXECUTE IMMEDIATE(截断模式中所有表的过程)

我需要创建一个过程,它将从一个模式中的表中删除所有数据.我尝试过类似的东西

CREATE OR REPLACE PROCEDURE CLEAR_ALL
IS
  sql_truncate VARCHAR2(50);

  cursor c1 is
   SELECT table_name
   FROM all_tables 
   WHERE owner = 'KARCHUDZ_S';
BEGIN
  sql_truncate := 'TRUNCATE TABLE :text_string';
  FOR table_name in c1
   LOOP
      EXECUTE IMMEDIATE sql_truncate USING table_name;
   END LOOP;
END CLEAR_ALL;
Run Code Online (Sandbox Code Playgroud)

但它给了我两个我无法理解和修复的错误.

错误(13,7):PL/SQL:语句被忽略

错误(13,44):PLS-00457:Statment必须是SQL的类型< - (这个错误我必须翻译,因为我使用大学Oracle 11g基础有波兰语lang)

oracle plsql procedure execute-immediate

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

如何在PL / SQL中访问字符串的索引?

我有一个节目说

DECLARE
str VARCHAR2(20);
BEGIN
str:='Test';
DBMS_OUTPUT.PUT_LINE(// Here I want to print a character of any index from string//);
END;
/
Run Code Online (Sandbox Code Playgroud)

怎么做?

sql string oracle plsql

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

在PL/SQL中列出过程参数

我可以通过查询dba_procedures来检索所有过程的列表.但是我只能提取过程名称.但我也需要他们的参数.

现在,我知道我可以通过查询all_source表来访问"当前用户可访问的存储对象的文本源".

但是有没有其他方法来检索过程的参数?

oracle plsql plsqldeveloper

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

MAP成员函数如何与Oracle中对象类型的成员函数不同

我很好奇MAP关键字给予Object类型的成员函数,并希望知道MAP成员函数如何与Oracle中对象类型的成员函数不同

oracle plsql

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

在具有许多关系的表中删除100万行的最佳方法

我有一组表,其中主表有150万行.其中一个子项也接近100万行.

主表的数据也必须复制到历史表中.我写了一个PLSQL脚本来首先删除子行和子行,但这个过程耗时太长,接近12小时.

我正在使用批量收集来删除数据.

该脚本将在每天星期一凌晨3点由Java调度程序调用.

我认为在第一次批量删除(有百万行)之后,该过程将很快,因为数据库每周只会增长近30k个寄存器.

解决这个问题的最佳解决方案是什么?

sql oracle plsql delete-row

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