我有一个这种形式的查询,平均需要约100个子句元素,并且在极少数情况下> 1000个元素.如果大于1000个元素,我们将把in子句中的内容减少到1000(Oracle最大值).
SQL的形式是
Run Code Online (Sandbox Code Playgroud)SELECT * FROM tab WHERE PrimaryKeyID IN (1,2,3,4,5,...)
我选择的表是巨大的,将包含比我的in子句中多数百万行.我担心的是优化器可能会选择进行表扫描(我们的数据库没有最新的统计数据 - 是的 - 我知道......)
是否有一个提示我可以强制使用主键 - 不知道主键的索引名称,可能是....../*+ DO_NOT_TABLE_SCAN*/?
是否有任何创造性的方法来撤回数据
Run Code Online (Sandbox Code Playgroud)SELECT * FROM tab WHERE PrimaryKeyID = 1 UNION SELECT * FROM tab WHERE PrimaryKeyID = 2 UNION SELECT * FROM tab WHERE PrimaryKeyID = 2 UNION ....
我需要修改5位以上的数字.LENGTH函数用于字符串而不是数字位数。如何计算数字中的数字?
我正在将一些存储过程从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) 这是我为Oracle PL/SQL Armstrong Number编写的代码
declare
num number;
sum number;
temp number;
val number;
begin
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:当期待下列之一时遇到符号"=":(
我做错了什么?谢谢.
我在本地机器上的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) 我的包裹体中有一个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窗口中执行此过程?
我有一个具有立即执行语句的过程。在该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参数。因此,我需要获得这两个输出,以在调用立即执行的过程中使用。但这不是在变量中设置输出。我是否缺少步骤,还是应该使用其他方法来使用参数?
我想知道你是否可以指出我正确的方向.我花了最后一小段时间试图找出如何在块代码中使用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到尝试引用过程变量定义,但是没有一个对我有用
我尝试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到屏幕一切都很完美(有很多值,不仅仅是一个).所以问题在于语句执行.我该如何解决?
非常感谢你!
我刚刚找到一个问题的答案,我遇到的问题是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)