标签: plsql

没有连接的Oracle IN子句有什么性能影响?

我有一个这种形式的查询,平均需要约100个子句元素,并且在极少数情况下> 1000个元素.如果大于1000个元素,我们将把in子句中的内容减少到1000(Oracle最大值).

SQL的形式是

SELECT * FROM tab WHERE PrimaryKeyID IN (1,2,3,4,5,...)
Run Code Online (Sandbox Code Playgroud)

我选择的表是巨大的,将包含比我的in子句中多数百万行.我担心的是优化器可能会选择进行表扫描(我们的数据库没有最新的统计数据 - 是的 - 我知道......)

是否有一个提示我可以强制使用主键 - 不知道主键的索引名称,可能是....../*+ DO_NOT_TABLE_SCAN*/?

是否有任何创造性的方法来撤回数据

  1. 我们执行最少的往返次数
  2. 我们读取的块数最少(在逻辑IO级别?)
  3. 这会更快..
SELECT * FROM tab WHERE PrimaryKeyID = 1
  UNION
SELECT * FROM tab WHERE PrimaryKeyID = 2
  UNION
SELECT * FROM tab WHERE PrimaryKeyID = 2
  UNION ....
Run Code Online (Sandbox Code Playgroud)

sql oracle performance plsql sql-tuning

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

如何在oracle pl / sql中计算数字中的位数?

我需要修改5位以上的数字.LENGTH函数用于字符串而不是数字位数。如何计算数字中的数字?

plsql oracle11g

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

用于检查表是否存在的简单PL/SQL无效

我正在将一些存储过程从Sybase TSQL转换为Oracle PL/SQL,我已经遇到了一个我正在努力解决的问题!

以下代码将无法运行:

DECLARE

t INT := 0;
t_error EXCEPTION;
v_line VARCHAR2(100);

BEGIN

SELECT COUNT(*) INTO t FROM user_tables WHERE table_name = UPPER('tbl_BSUK_PriceIssue');

IF t = 1 THEN
  EXECUTE IMMEDIATE 'DROP TABLE tbl_BSUK_PriceIssue';
  t := 0;
  SELECT COUNT(*) INTO t FROM user_tables WHERE table_name = UPPER('tbl_BSUK_PriceIssue');
  IF t = 1 THEN
    RAISE t_error;
  END IF;
END IF;

EXCEPTION
  WHEN t_error THEN
  v_line := '<<< FAILED DROPPING table tbl_BSUK_PriceIssue >>>';
  dbms_output.put_line (v_line);
  WHEN OTHERS THEN
    v_line := '<<< Unknown Error …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

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

阿姆斯特朗号错误

这是我为Oracle PL/SQL Armstrong Number编写的代码

declare
num number;
sum number;
temp number;
val number;
begin
num:=&num;
temp:=num;
while temp<>0 loop
val:=trunc(temp mod 10);
sum:=sum +(val*val*val);
temp:=temp/10;
end loop;
if sum=num then
dbms_output.put_line('number is Armstrong');
else
dbms_output.put_line('number is not Armstrong');
end if;
end;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

第11行的错误:ORA-06550:第11行第10列:PLS-00103:当遇到以下情况之一时遇到符号"+":(符号"("代替"+"继续.ORA-06550 :第11行,第24栏:PLS-00103:遇到下列其中一项时遇到符号";":*& - +/at mod余数rem || year day符号")"代替";" 接着说.ORA-06550:第14行,第7列:PLS-00103:当期待下列之一时遇到符号"=":(

我做错了什么?谢谢.

sql oracle plsql

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

从匿名块调用存储过程

我在本地机器上的Oracle 11gr2数据库上用sql developer编写的plsql存储过程读取结果有问题.

这是我的表:

create table MY_TEST_TABLE
(employee_id    NUMBER(6)
,first_name     VARCHAR2(20)
,last_name      VARCHAR2(25) 
,email          VARCHAR2(25) 
,phone_number   VARCHAR2(20));
Run Code Online (Sandbox Code Playgroud)

这是程序声明:

create or replace PACKAGE TEST_PACKAGE AS 
procedure test_procedure (i_id in number,
                          o_data out sys_refcursor);
END TEST_PACKAGE;
Run Code Online (Sandbox Code Playgroud)

这是身体:

create or replace PACKAGE BODY TEST_PACKAGE AS
  procedure test_procedure (i_id in number,
                        o_data out sys_refcursor) AS
  BEGIN
    open o_data for
      select  employee_id,
          first_name,
          last_name,
          email,
          phone_number
      from my_test_table
      where EMPLOYEE_ID = i_id;     
    close o_data;
  END test_procedure;
END TEST_PACKAGE;
Run Code Online (Sandbox Code Playgroud)

这是匿名块调用:

SET serveroutput on
DECLARE
  in_id number; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures

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

如何使用out sys_refcursor参数执行oracle过程?

我的包裹体中有一个proc:

create or replace package body MYPACKAGE is

    procedure "GetAllRules"(p_rules     out sys_refcursor)
    is
    begin
        open p_rules for
        select * from my_rules;

    end "GetAllRules";

-- etc
Run Code Online (Sandbox Code Playgroud)

我在我的软件包规范中公开了这个.

如何在PL SQL Developer(或类似版本)的新SQL窗口中执行此过程?

sql oracle plsql

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

使用调用过程的立即执行语句中的out参数

我有一个具有立即执行语句的过程。在该execute立即语句中调用具有两个out参数的过程。我在尝试获取那些要在调用execute立即语句的过程中使用的参数时遇到麻烦。

execute_stmt := 'DECLARE pi_error_log_rec error_log%ROWTYPE; p_plan_id NUMBER; begin SCHEMA.PACKAGE_NAME.' ||
                PROCEDURE || '(' ||
                p_audit_log_id || ', ' ||
                V_PARAMETER1 || ', ' || '''' ||
                V_PARAMETER2 || '''' ||
                ', p_plan_id, pi_error_log_rec); end;';
execute immediate execute_stmt;

if(pi_error_log_rec.error_text IS NOT NULL) THEN
  --do stuff;
ELSE
  --do stuff;
Run Code Online (Sandbox Code Playgroud)

out参数为p_plan_id和pi_error_log_rec,其余为IN参数。因此,我需要获得这两个输出,以在调用立即执行的过程中使用。但这不是在变量中设置输出。我是否缺少步骤,还是应该使用其他方法来使用参数?

sql oracle plsql stored-procedures

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

Oracle绑定变量,程序和头痛

我想知道你是否可以指出我正确的方向.我花了最后一小段时间试图找出如何在块代码中使用Bind变量和声明.我的问题是,每次我尝试在SQL Developer中运行代码块时,它返回错误"Bind Variable"disp"都没有声明.

在非块代码中,我可以得到我期望的结果.以下我知道工作,我得到的结果:

var disp varchar2(200);
begin
    test_procedure('test', 100, :disp);
end;
/
print :disp
Run Code Online (Sandbox Code Playgroud)

上面的代码返回一个值test100.

但是,如果我尝试将其移动到一个代码块中,我可以在外部应用程序(Java或PHP)中作为单行使用,我开始遇到麻烦.到目前为止我所拥有的是:

declare
    disp varchar2(200);
begin
    test_procedure('test', 100, :disp);
end;
/
print :disp
Run Code Online (Sandbox Code Playgroud)

当我运行以上内容时,我得到:

绑定变量"disp"未声明

我尝试了一些不同的方法,从声明框中使用var到尝试引用过程变量定义,但是没有一个对我有用

oracle plsql procedures

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

Java的.循环中的语句执行

我尝试INSERT在循环中执行查询:

String selectTableSQL = "SELECT * "
                      + "FROM testTable";

ResultSet rs = stmt.executeQuery(selectTableSQL);

while (rs.next()) {
     String rangeName = rs.getString("RANGENAME");                
     insertTableSQL = "INSERT INTO testTable2 "
                    + "VALUES ('" + rangeName + "')";

      try {
           stmt.executeUpdate(insertTableSQL);
      } catch (SQLException e) {
           // do nothing             
      }
Run Code Online (Sandbox Code Playgroud)

但经过一次迭代后,这个循环就会中断.如果我不执行INSERT查询和打印rangeName到屏幕一切都很完美(有很多值,不仅仅是一个).所以问题在于语句执行.我该如何解决?

非常感谢你!

java oracle plsql

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

ORACLE PL/SQL变量函数范围 - 需要说明

我刚刚找到一个问题的答案,我遇到的问题是PL/SQL变量没有被函数识别,我希望有人可以向我解释为什么我的解决方案有效以及发生了什么"在幕后".

背景

作为优化项目的一部分,我正在尝试收集存储过程中各个SQL脚本的度量标准.我正在解析的存储过程具有一个In-type日期参数,我需要定义它以运行每个单独的SQL脚本:

CREATE OR REPLACE myStoredProc (DATE_IN DATE, ERROR_OUT OUT VARCHAR2)
IS
BEGIN
    --Truncate Temp Tables
    --6 Individual SQL Scripts
EXCEPTION
    --Error Handling
END;
Run Code Online (Sandbox Code Playgroud)

为了单独运行每个脚本,我决定将每个SQL语句放入PL/SQL块并将DATE_IN参数作为变量提供:

DECLARE
    DATE_IN DATE := TO_DATE('16-JUL-2014','DD-MON-RR'); 
BEGIN
    --Place individual script here
END;
Run Code Online (Sandbox Code Playgroud)

问题

这种方法适用于引用此DATE_IN变量的几个查询,但是一个查询引用了外部函数,该函数DATE_IN作为参数开始抛出ORA-00904错误:

DECLARE  
    DATE_IN DATE := TO_DATE('16-JUL-2014','DD-MON-RR'); 
BEGIN
    insert into temp_table
    SELECT table1.field1,
           table1.field2,
           table2.fieldA,
           MyFunction(table1.field1, DATE_IN) --This was the problem line
      FROM
           table1,
           table2
     WHERE EXISTS (inner query)
       AND table1.keys = table2.keys
       AND table2.date <= DATE_IN …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql stored-procedures stored-functions

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