我有一个类似的查询
SELECT id FROM xyz WHERE ...;
Run Code Online (Sandbox Code Playgroud)
它有一个或多或少复杂的 WHERE 子句,并正好返回一列(ID)的一行。我需要此 ID 用于脚本中的多个后续查询。所以我的目标是在一个变量中重用这个结果,但我没有找到一个有效的解决方案。
在这种情况下,加入此查询不是一个好的选择。那么是否有可能告诉 Oracle 将这个单个结果存储在一个变量中并使用这个变量来构建新的查询——明确地在其他查询的条件子句中使用?
如果是这样,也许有人可以发布一个简单的示例-最简单的可能是……。喜欢
SELECT :VARIABLE FROM DUAL
Run Code Online (Sandbox Code Playgroud) 在 Oracle 中寻找示例代码来做同样的事情。IE
删除表 T1 上的插入触发器,其工作是基于派生数据在 T2 中创建一行。这个 PL-SQL api 会是什么样子?
通过替换插入触发器,我会在现实世界的应用程序中丢失什么?
基于以下响应的更多说明:我们不希望远程客户端同时写入表 T1 和 T2。这是一个高吞吐量的数据和性能将受到影响。因此远程客户端将只写入 T1。从 T1 转移到 T2 应该在本地发生。
我可以在存储过程或函数的主体中显式限定变量:
create or replace
PROCEDURE ptest AS
int_val INT;
BEGIN
ptest.int_val:=0;
END;
/
Run Code Online (Sandbox Code Playgroud)
如何做同样的内部触发器?
create table temp1(id int not null);
create or replace trigger trg_before_insert_temp1 before insert on temp1 for each row
declare int_val int;
begin
trg_before_insert_temp1.int_val := 0; -- PLS-00201, identifier must be declared
end trg_before_insert_temp1;
/
Run Code Online (Sandbox Code Playgroud) 快速提问,在填充我的表后,我通过我的解释计划注意到索引,在大多数情况下,似乎只有在我执行后才生效GATHER_TABLE_STATS:
Exec DBMS_STATS.GATHER_TABLE_STATS(ownname => 'USER/SCHEMA', tabname => 'MYTABLE', cascade=> true, degree=> 8);
Run Code Online (Sandbox Code Playgroud)
“ CASCADE ”属性定义为:收集有关此表索引的统计信息。索引统计信息收集不是并行化的。使用此选项等效于GATHER_INDEX_STATS在每个表的索引上运行过程。
所以我的问题是,我应该REBUILD在 之前运行我的索引吗GATHER_TABLE_STATS,因为我假设收集索引统计信息并重建它们不是一回事,或者是吗?
目前,我运行dbms_index_utl.build_table_indexes重建我的索引,然后是GATHER_TABLE_STATS,我只是不知道是否有必要,请注意,我的解释计划似乎表明它是,否则,除非我向查询添加提示,否则索引将不会'习惯了。
在 PL/SQL 中,假设我有一些定义如下的关联数组:
declare
type a_arr_t is table of PLS_INTEGER index by PLS_INTEGER;
a_arr a_arr_t;
Run Code Online (Sandbox Code Playgroud)
然后,我按如下方式稀疏地填充数组:
begin
a_arr(1) := 2;
a_arr(10) := 4;
a_arr(100) := 6;
end;
Run Code Online (Sandbox Code Playgroud)
是否有一些运算符或函数可以为我提供数组的索引,(1,10,100)作为某种集合,例如indices of在forall语句中?
我试图在我的 WHERE 子句中使用 IF...ELSE 构造来有选择地将条件应用于我的SELECT.
这应该工作吗?
CREATE OR REPLACE package body If_Else_Pack IS
PROCEDURE Moving
(
obj_A IN varchar2,
obj_B IN varchar2,
obj_C IN varchar2,
obj_D IN varchar2,
cur_Result OUT T_CURSOR
) IS
BEGIN
OPEN cur_Result FOR
SELECT
w.assetid,
w.vehiclenumber,
w.LatLong,
w.CurrentSpeed,
w.timeOfMovement,
w.CurrentPlace,
w.curTime,
w.motion,
w.fuelR,
w.VehicleStart
FROM waypoints1 w
WHERE
IF ((obj_D= '0' OR obj_D IS NULL) AND (obj_C= '0' OR obj_C IS NULL)) THEN
WHERE w.customer_id =obj_A
AND w.delegate_user_id = obj_B;
ELSE IF ((obj_D= '0 …Run Code Online (Sandbox Code Playgroud) 我面临着一种我无法理解和克服的情况。
简而言之,我们有左连接查询,如:
select from a
left join b on a.key1=b.key1 or a.key1=b.key2
Run Code Online (Sandbox Code Playgroud)
这工作非常缓慢,同时两者分开:
select from a
left join b on a.key1=b.key1
select from a
left join b on a.key1=b.key2
Run Code Online (Sandbox Code Playgroud)
工作非常快。
b.key1 有正常索引
b.key2 有正常索引
我无法理解这种行为的原因?我的连接策略或索引使用中是否缺少一些非常基本的东西?
在这里,我们有详细的计划:
无或(TOP_USTR_ADMIN_IP - ustrip 列的索引名称):
SQL> explain plan for
SELECT * FROM top.macs_constraint mc
LEFT JOIN top.top_ustr tu ON tu.ustrip = mc.IP;
Explained.
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Plan hash value: 349751289
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost …Run Code Online (Sandbox Code Playgroud) 我有 Oracle DB 11g 企业版,我想从我的 java 代码执行 sql 脚本。我正在从 .sql 文件中读取这个 sql 脚本,该脚本包含诸如create table, create type, alter table, drop type, 之类的语句drop procedure,insert into以及带有begin和end以及所有此类构造的pl/sql 块。
我的问题是,如何将单独的 sql 语句从 java 代码中分离出来执行?在 MS SQL 中,我可以简单地按GO关键字分隔这些 sql 语句,而在 Oracle db 中没有这样的分隔符。那么通常什么在 Oracle db 脚本中用作分隔符?
例如,我在我的 sql 脚本和其他 sql 语句中有以下创建触发器块。这里我有分号,我不能将其视为 SQL 语句终止符(PL/SQL 块本身可以包含多个分号分隔的语句)。这意味着我不能使用;类似于GO(在 MS SQL 中)。
CREATE OR REPLACE TRIGGER SQLVersionHistory_SeqNum_TRG
BEFORE INSERT
ON SQLVersionHistory
FOR …Run Code Online (Sandbox Code Playgroud) 我想从返回 SYS_REFCURSOR 类型值的函数中进行选择。
例如 :
CREATE OR REPLACE FUNCTION my_funtion (
my_param IN VARCHAR2)
RETURN SYS_REFCURSOR
IS
l_return SYS_REFCURSOR;
BEGIN
OPEN l_return FOR
SELECT last_name, first_name
FROM employees
WHERE id = my_param
ORDER BY employee_id;
RETURN l_return;
END my_funtion;
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情:
select * from my_function('id015');
Run Code Online (Sandbox Code Playgroud)
甚至 :
select alias.last_name from my_function('id015') alias;
Run Code Online (Sandbox Code Playgroud) 我使用oracle 12c。我尝试将所有表的所有权限授予用户。将来我不需要为该用户添加任何权限。我需要这样做。我不想将系统表授予该用户。我写了 pl/sql 命令。但它给出了错误。
BEGIN
2 FOR t IN (select * from dba_tables where owner not like '%SYS%' AND owner not like '%ADMIN%' AND iot_type IS NULL)
3 LOOP
4 EXECUTE IMMEDIATE 'GRANT ALL PRIVILEGES ON '|| t.owner ||'.' || t.table_name ||' TO GGSTEST';
5 END LOOP;
6 END;
7 /
BEGIN
*
ERROR at line 1:
ORA-00905: missing keyword
ORA-06512: at line 4
Run Code Online (Sandbox Code Playgroud)
什么是错误?谢谢。
我使用 dbms_print
GRANT ALL ON OUTLN.OL$ TO GGSTEST
GRANT ALL ON OUTLN.OL$HINTS TO GGSTEST
GRANT …Run Code Online (Sandbox Code Playgroud) plsql ×10
oracle ×9
select ×2
trigger ×2
array ×1
cursors ×1
java ×1
jdbc ×1
join ×1
oracle-10g ×1
oracle-12c ×1
permissions ×1
query ×1
scripting ×1