标签: plsql

EXECUTE IMMEDIATE SELECT INTO语句中缺少关键字 - Oracle PL/SQL

下面的查询是我试图运行的PL/SQL的简化版本,它只显示了一般结构.简而言之,我试图从SPECIAL_TABLE变量中提取信息c, d.

DECLARE
  c NUMBER;
  d NUMBER;
BEGIN
  FOR all_tab IN
  (SELECT * FROM all_tables)
  LOOP
    BEGIN
      EXECUTE IMMEDIATE 'SELECT a, d INTO c, d
      FROM ' || :name || '.SPECIAL_TABLE WHERE name = '''
      :name || ''' AND table_name = ''' || all_tab.table_name || ''';

    ...

    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERROR OCCURRED');
    END;
END;
Run Code Online (Sandbox Code Playgroud)

上面的查询不起作用(通过上面的查询我的意思是EXECUTE IMMEDIATE),而Oracle声明905 missing keyword.据我所知,遵循这里的流程.注意,'''这样我可以'为SELECT语句转义单个,然后一起完成整个字符串.有什么奇怪的,我可以按照下面的代码进行操作,没有错误:

DECLARE
  c NUMBER;
  d NUMBER; …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql dynamic-sql oracle11g

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

如何以24小时格式添加小时数

例如,我想以24小时格式向结束日期添加8小时。我尝试在第一行添加+ 8/24,“ DD-MM-YYYY HH24:MI:SS”,但这会导致错误。

到目前为止,这是我的查询。

SELECT to_char(IN_ENDDATE, 'DD-MM-YYYY HH24:MI:SS')
  INTO IN_END_DATE_STRING
  FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

sql database oracle plsql date-arithmetic

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

将rowtype变量复制到另一个

我有

l_tab1 table1%rowtype;
l_tab2 table2%rowtype;
Run Code Online (Sandbox Code Playgroud)

table1和table2的结构相同。

如何将数据从l_tab1移动到l_tab2?

现在我可以看到两种方式,但是我不喜欢它,因为我需要对字段进行硬编码。

1个

l_tab2.field1 := l_tab1.field1;
l_tab2.field2 := l_tab1.field2;
Run Code Online (Sandbox Code Playgroud)

2

select * into l_tab2
from table1
where field1 = l_tab1.field1
  and field2 = l_tab1.field2;
Run Code Online (Sandbox Code Playgroud)

3

我相信它应该容易得多

insert into l_tab2
values l_tab1;
Run Code Online (Sandbox Code Playgroud)

或类似的东西而无需使用字段。

oracle plsql

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

如何一次在不同的方案上运行查询

我想对不同的方案运行查询以获取数据并将其导出。我使用以下代码

DECLARE
  sql_statment VARCHAR2(2000);
BEGIN
  FOR c IN (SELECT brchcode FROM brchs) LOOP
    sql_statment := 'select distinct ''' || c.brchcode ||''', t.risuid from ' || c.brchcode ||
                    '.reg_individualacnt_detail t
                      where t.historytypecode = 60';

    EXECUTE IMMEDIATE sql_statment;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

其中brchcode是不同方案的名称

我看不到任何输出。我能做什么?

oracle plsql

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

动态SQL中的区别黑白字符串连接和绑定变量

差不多的头衔。我想知道字符串连接之间在行为和性能上是否存在差异

var_name := 'SKING';
sql := 'select * from emp where ename = ' || var_name;
execute immediate sql;
Run Code Online (Sandbox Code Playgroud)

并绑定变量

sql := 'select * from emp where ename = :1';
execute immediate sql
using var_name;
Run Code Online (Sandbox Code Playgroud)

在动态SQL中。谢谢!

sql oracle plsql

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

如何在PL / SQL中动态调用包方法列表

我有一种情况,我想从具有不同参数的游标执行动态获取的方法。Get_Parameter_Value___(head_rec_.objkey,parameter_);如下面的示例所示,这些参数值在循环中被替换(使用)为值。

PROCEDURE Dynamic_exe(
    keyvalue_ IN VARCHAR2)
IS 
param_str_        VARCHAR2(2000);
temp_param_str_   VARCHAR2(2000);
method_stmt_      VARCHAR2(100);

CURSOR get_method IS
  SELECT exe_method
  FROM method_tab

BEGIN

param_str_        := Substr(rec_.exe_method,Instr(rec_.exe_method,'(')+1,(Instr(rec_.exe_method,')')-1)-Instr(rec_.exe_method,'('));
temp_param_str_   := param_str_;
method_stmt_      := rec_.exe_method;

WHILE temp_param_str_ IS NOT NULL LOOP
   IF (Instr(temp_param_str_,',') > 0 )THEN                
       parameter_          := trim(Substr(temp_param_str_,1,Instr(temp_param_str_,',')-1));
       temp_param_str_     := Substr(temp_param_str_,Instr(temp_param_str_,',')+1);
   ELSE
      parameter_          := trim(temp_param_str_);
      temp_param_str_     := NULL;
   END IF;
   parameter_value_  := Get_Parameter_Value___(head_rec_.objkey,parameter_);            
   method_stmt_      := REPLACE(method_stmt_,parameter_,''''||parameter_value_||'''');
END LOOP; 

FOR rec_ IN get_method LOOP
   EXECUTE IMMEDIATE 'BEGIN '||method_stmt_||'; END;';
END LOOP;

END Dynamic_exe; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic

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

SQL:用连续索引替换不同的(数字)值

我有一个很大的表,需要将其导出到文本文件,因此可以将其读取到其他程序(R)中。为了避免编写/读取大文本文件的麻烦,我想通过用连续索引替换所有不同的数值来转换其中一列(所讨论的列是一个ID,它恰好是数字。设置不同的字符)。因此,我想用一个连续的索引替换此ID的所有不同值(将n不同的值替换1为n)。

我的数据如下所示:

ID        SOMECHAR    SOMECOUNT
---------------------------------
1534561   FISH        2
7537281   CAT         14
4738920   CAT         3
7537281   BIRD        7
7537281   FISH        6
1534561   CAT         10
...       ...         ...
Run Code Online (Sandbox Code Playgroud)

我想写一个像这样的表:

ID        SOMECHAR    SOMECOUNT
---------------------------------
1         FISH        2
2         CAT         14
3         CAT         3
2         BIRD        7
2         FISH        6
1         CAT         10
...       ...         ...
Run Code Online (Sandbox Code Playgroud)

1)我可以期望节省大量空间吗?我大约有1亿行和1000万个不同的ID,原始ID为10位数字。

2)如何在SQL或PL / SQL中执行此操作?该REPLACE命令适用于字符串...我是否需要制作第二张表作为具有每个不同ID和连续索引的查找?如果是,如何获取索引?

sql oracle plsql

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

如果另一个表被更改,则更改一个表的方法

例如,我有表T1和存档表T1_A

Create table T1(n number); 
Create table T1_A(archieve_dt date,n number);
Run Code Online (Sandbox Code Playgroud)

如果要在T1中添加一列,要使激活正常工作,我需要在T1_A中添加同一列。

有什么电话吗?

Alter table T1_A add n1 number;
Run Code Online (Sandbox Code Playgroud)

如果我打电话给这个

Alter table T1 add n1 number;
Run Code Online (Sandbox Code Playgroud)

找不到有关此类触发器的任何信息。

sql oracle ddl plsql oracle11g

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

Oracle APEX应用程序中软件包中匿名块的执行点

我正在从ORACLE APEX页面中的两个不同执行点调用同一程序包的两个不同过程。该软件包中包含匿名块。(写在包体末尾)

执行点: 加载时:在“主体”区域之前。 调用:pkg_name.proc_1 ;

项目只读部分。 调用:pkg_name.proc_2 ;

我已经在包中的匿名块中登录以检查其执行情况。我观察到它在页面渲染期间仅执行一次。但是,每当我对程序包进行调用时(通过动态操作),页面呈现后,匿名块就会被执行。

我在oracle apex中读过,每次对DB的调用都会从池中获得一个新的DB连接。

匿名块如何在程序包中执行->在数据库会话中一次执行还是在每次调用程序包时执行?

如果一次进入数据库会话,这是否意味着整个页面呈现都在一个数据库会话中发生,与动态操作不同?

请帮忙!

谢谢。

oracle plsql oracle-apex

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

更新语句中的DBMS_SQL.NUMBER_TABLE引发无效数据类型错误

为什么选择有效但更新会抛出无效数据?

DECLARE
    L_NUMBER NUMBER;
    L_NUMBER_TABLE DBMS_SQL.NUMBER_TABLE;
    L_LAST_PRINTED_DATE DATE := SYSDATE;
BEGIN
    L_NUMBER_TABLE(0) := 1033000;

-- THIS WORKS
SELECT TB.COLUMN_VALUE
INTO L_NUMBER
FROM TABLE(L_NUMBER_TABLE) TB;

-- THIS DOES NOT WORK
--  ERROR AT LINE 1
--  ORA-00902: INVALID DATATYPE
--  ORA-06512: AT LINE 13
UPDATE SCHEMA.REAL_NUMBER_TABLE
SET    REAL_NUMBER_DATE           = L_LAST_PRINTED_DATE
WHERE  EXISTS (  SELECT TB.COLUMN_VALUE
                    FROM TABLE( L_NUMBER_TABLE ) TB
                    WHERE TB.COLUMN_VALUE = REAL_NUMBER_COLUMN );


END;
Run Code Online (Sandbox Code Playgroud)

我试图通过游标循环并更新在游标中找到的主要序列的最后打印日期。我尝试通过游标循环,但是当我将游标返回给客户端时,它抛出索引不足错误。因此,我不得不创建两个游标,一个游标循环,另一个游标返回。我的目标是学习保存用于更新表的集合的最简单,最可维护的方法。

DECLARE
    CURSOR L_ORIGINAL_CURSOR IS SELECT ...

    L_CURSOR_COLUMN_1    PLS_INTEGER;
    L_CURSOR_COLUMN_2    PLS_INTEGER;
    L_CURSOR_COLUMN_3    PLS_INTEGER;
    -- Keep …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql oracle12c

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