标签: plsql

如何将单个结果存储在变量中并在查询(Oracle)中重用?

我有一个类似的查询

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 oracle-11g-r2 plsql scripting

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

INSERT 触发器的替代方案

在 Oracle 中寻找示例代码来做同样的事情。IE

删除表 T1 上的插入触发器,其工作是基于派生数据在 T2 中创建一行。这个 PL-SQL api 会是什么样子?

通过替换插入触发器,我会在现实世界的应用程序中丢失什么?

基于以下响应的更多说明:我们不希望远程客户端同时写入表 T1 和 T2。这是一个高吞吐量的数据和性能将受到影响。因此远程客户端将只写入 T1。从 T1 转移到 T2 应该在本地发生。

trigger oracle plsql

5
推荐指数
3
解决办法
3647
查看次数

如何限定触发器主体内的变量(PL/SQL)?

我可以在存储过程或函数的主体中显式限定变量:

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)

trigger oracle plsql

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

Oracle 11G - 索引重建 VS GATHER_TABLE_STATS

快速提问,在填充我的表后,我通过我的解释计划注意到索引,在大多数情况下,似乎只有在我执行后才生效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,我只是不知道是否有必要,请注意,我的解释计划似乎表明它是,否则,除非我向查询添加提示,否则索引将不会'习惯了。

oracle plsql

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

检索关联数组的索引作为集合

在 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 offorall语句中?

oracle plsql array

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

如何在 WHERE 子句中使用 IF...ELSE 条件?

我试图在我的 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)

query stored-procedures plsql select

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

谓词中带有“或”的慢速连接行为

我面临着一种我无法理解和克服的情况。

简而言之,我们有左连接查询,如:

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 join oracle-10g plsql

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

如何从 Oracle SQL 脚本中分离出单独的 sql 语句以从 Java 代码中执行

我有 Oracle DB 11g 企业版,我想从我的 java 代码执行 sql 脚本。我正在从 .sql 文件中读取这个 sql 脚本,该脚本包含诸如create table, create type, alter table, drop type, 之类的语句drop procedureinsert into以及带有beginend以及所有此类构造的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)

oracle plsql jdbc java

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

从返回 CURSOR 的函数中选择

我想从返回 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 plsql cursors select

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

将数据库中所有表的所有权限授予用户

我使用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)

oracle permissions plsql oracle-12c

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