下面的查询是我试图运行的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) 例如,我想以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) 我有
l_tab1 table1%rowtype;
l_tab2 table2%rowtype;
Run Code Online (Sandbox Code Playgroud)
table1和table2的结构相同。
如何将数据从l_tab1移动到l_tab2?
现在我可以看到两种方式,但是我不喜欢它,因为我需要对字段进行硬编码。
l_tab2.field1 := l_tab1.field1;
l_tab2.field2 := l_tab1.field2;
Run Code Online (Sandbox Code Playgroud)
select * into l_tab2
from table1
where field1 = l_tab1.field1
and field2 = l_tab1.field2;
Run Code Online (Sandbox Code Playgroud)
我相信它应该容易得多
insert into l_tab2
values l_tab1;
Run Code Online (Sandbox Code Playgroud)
或类似的东西而无需使用字段。
我想对不同的方案运行查询以获取数据并将其导出。我使用以下代码
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是不同方案的名称
我看不到任何输出。我能做什么?
差不多的头衔。我想知道字符串连接之间在行为和性能上是否存在差异
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中。谢谢!
我有一种情况,我想从具有不同参数的游标执行动态获取的方法。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) 我有一个很大的表,需要将其导出到文本文件,因此可以将其读取到其他程序(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和连续索引的查找?如果是,如何获取索引?
例如,我有表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)
找不到有关此类触发器的任何信息。
我正在从ORACLE APEX页面中的两个不同执行点调用同一程序包的两个不同过程。该软件包中包含匿名块。(写在包体末尾)
执行点: 加载时:在“主体”区域之前。 调用:pkg_name.proc_1 ;
项目只读部分。 调用:pkg_name.proc_2 ;
我已经在包中的匿名块中登录以检查其执行情况。我观察到它在页面渲染期间仅执行一次。但是,每当我对程序包进行调用时(通过动态操作),页面呈现后,匿名块就会被执行。
我在oracle apex中读过,每次对DB的调用都会从池中获得一个新的DB连接。
匿名块如何在程序包中执行->在数据库会话中一次执行还是在每次调用程序包时执行?
如果一次进入数据库会话,这是否意味着整个页面呈现都在一个数据库会话中发生,与动态操作不同?
请帮忙!
谢谢。
为什么选择有效但更新会抛出无效数据?
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) oracle ×10
plsql ×10
sql ×6
oracle11g ×2
database ×1
ddl ×1
dynamic ×1
dynamic-sql ×1
oracle-apex ×1
oracle12c ×1