我正在运行存储过程:
CREATE OR REPLACE MYSP (runDate Date)
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE MYTABLE AS (SELECT * FROM DATATABLE WHERE DATADATE = :1' USING runDate);
END MYSP;
Run Code Online (Sandbox Code Playgroud)
我收到错误 -
ORA-01027: bind variables not allowed for data definitions operations
ORA-06512: "Database.MYSP", line 4
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我在哪里出错.
我有一个Oracle包,其输入参数为开始日期sysdate-365,结束日期为sysdate + 90.它找到从sysdate-365到sysdate + 90的每个日期,这是455天,然后它为每个日期循环,从主表中获取记录再次循环基于主表数据,从其他表获取值,做一些逻辑并插入工作台.完成需要10个多小时.
我想过使用dbms_scheduler来运行包并行,因为DBA不建议这样做.任何人都可以建议任何其他方式来提高性能?
代码段:
loop for date range
select some_data from master_table where master_date = cursor.date;
loop for
select other_data from other_table where other_date = cursor.date
start with some_data
connect by other_parent = prior other_child;
select count(*) into v1cnt from third_table where third_date = cursor.date and third_data=other_data;
if v1cnt > 0 then
select third_data into variable1 from third_table where third_date = cursor.date and third_data=other_data;
else
variable1 = null;
end if;
select count(*) into v2cnt from fourth_table where …Run Code Online (Sandbox Code Playgroud) 我在执行ps-sql过程时遇到错误.
下面是我的剧本.
set serveroutput on size 100000
set echo off
set feedback off
set lines 300
declare
cursor sessinfo is
SELECT NVL(s.username, '(oracle)') AS username,
s.osuser,
s.sid,
s.serial#,
p.spid,
s.status,
s.module,
s.machine,
s.program,
TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time,
s.last_call_et/3600 last_call_et_Hrs,
lpad(t.sql_text,30) "Last SQL"
from gv$session s,
gv$sqlarea t,
gv$process p
where s.sql_address = t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE' and
s.last_call_et > (3600)
order by last_call_et;
sess sessinfo%rowtype;
sql_string1 Varchar2(2000);
sql_string2 Varchar2(2000);
begin
open sessinfo;
loop
fetch sessinfo into …Run Code Online (Sandbox Code Playgroud) 我创建了Trigger来检查广告表中的付款并且应该更新另一个表(customer_account)有人知道bug在哪里吗?
CREATE OR REPLACE TRIGGER Payment_check
after UPDATE ON Ads
FOR EACH ROW
BEGIN
IF NEW.Pay_done==('y'||'Y')THEN
UPDATE customer_account SET customer_account.Plcd_ads = NEW.Ad_id
WHERE customer_account.C_id = NEW.Customer;
ELSE
UPDATE customer_account SET customer_account.Pend_ads = NEW.Ad_id
WHERE customer_account.C_id = NEW.Customer;
END IF;
END;
//////bug
Error at line 7: PLS-00103: Encountered the symbol "." when expecting one of the following:
mod
continue current sql execute forall merge
pipe purge
The symbol "" was substituted for "." to continue.
5. IF NEW.Pay_done==('y'||'Y')THEN
6. UPDATE customer_account …Run Code Online (Sandbox Code Playgroud) 我试图在Oracle上执行下面的代码; 打算打印布尔值.这不是在复杂.任何帮助?
DECLARE
v_bool BOOLEAN;
BEGIN
IF (v_bool IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('By default the value is NULL');
ELSEIF (v_bool = TRUE) THEN
DBMS_OUTPUT.PUT_LINE('By default the value is TRUE');
ELSE
DBMS_OUTPUT.PUT_LINE('By default the value is FALSE');
END IF;
END;
Run Code Online (Sandbox Code Playgroud) 我创建了一个包含所有可信源的主机名的表.如果连接的主机不在snif_session表中,我已经编写了一个oracle注销触发器来获取该会话执行的所有sql的详细信息.我将输出带到utl_file输出,其中包含sid,主机名,连接时间.
SQL> select * from snif_Session;
ALLOWED_HOST
--------------------------------------------------
RND1
WORKGROUP\RND1
Run Code Online (Sandbox Code Playgroud)
我被卡住的地方是用于获取该特定会话执行的所有sql的查询(我可以从v $ mystat获取sid).
这样做效果最好:
select a.sql_id
,b.sql_text
from dba_hist_active_sess_history a
,dba_hist_sqltext b
where a.sql_id=b.sql_id
Run Code Online (Sandbox Code Playgroud)
要么
select s.sid
, s.serial#
, a.sql_text
from v$session s
join v$sqlarea a
on a.hash_value = s.sql_hash_value ;
Run Code Online (Sandbox Code Playgroud)
这是我写的代码(块),我将放在触发器中.
declare
machine_id varchar2(50);
val int;
auth_terminal varchar2(50);
check_machine varchar2(1000);
mydate char(50);
osuser_1 varchar2(50);
sid_1 int;
sql_query_1 varchar2(5000);
machine_1 varchar2(50);
trace_info UTL_FILE.FILE_TYPE;
begin
select machine into check_machine
from v$session
where sid in (select distinct(sid) from v$mystat) ;
select …Run Code Online (Sandbox Code Playgroud) 我想编写一个PL/SQL过程,找到所有无效对象,按层次方式排序(超类型--->子类型),然后编译它们.
一年几次,我的团队会出于某种原因编写一个新的Oracle软件包,而且很多时候这个软件包只引用了这些软件包(我们的软件包运行的用户/角色)已经有资格的表.
偶尔,情况并非如此.签入包,无法编译,我们得到一个含有表名附近行号的神秘错误消息.
麻烦的是,在这一点上,我们将等待几个小时(政治)批准过程发布,给予补助,我们检查包...并且它失败并带有新的表名.
有没有办法以编程方式获取所有引用的列表?如果是这样,我们可以将其自动化以检查dba_tab_privs以查看是否需要预先授予补助,或者甚至生成授权脚本以使实际发放这些授权的团队更容易(特别是几个月之后,当它部署到生产时)我们再一次经历了整个对不起的烂摊子.
我有下一张桌子:
CREATE TABLE my_table (
id VARCHAR2(20 BYTE) NOT NULL,
name VARCHAR2(40 BYTE) NOT NULL,
age NUMBER,
PRIMARY KEY (id, name)
);
Run Code Online (Sandbox Code Playgroud)
我想从my_table创建表集合.填写我的数据.
我尝试:
DECLARE
type my_type IS TABLE OF my_table%ROWTYPE;
my_data my_type := my_type();
BEGIN
my_data := my_type('1','Jon',5);
END;
Run Code Online (Sandbox Code Playgroud)
结果我得到:
ORA-06550: line 8, column 16:
PLS-00306: wrong number or types of arguments in call to 'my_type'
ORA-06550: line 8, column 16:
PLS-00306: wrong number or types of arguments in call to 'my_type'
ORA-06550: line 8, column 16:
PLS-00306: wrong …Run Code Online (Sandbox Code Playgroud) 我想出于某种目的更新我的日期列.已存储在列中的值如下所示
18-06-14
并且在更新时如果我不更新任何东西并进行调试和检查,则需要格式化为 2014-06-18T00:00:00
因此,在更新时,我在我的程序中得到如下错误.
ORA-1843:不是有效月份
以下是我将其作为更新参数发送的方式
LAUNCH_DATE = P_LAUNCH_DATE,
在P_LAUNCH_DATE我有更新的价值观.这给了我上面的错误.我该如何解决它.
UPDATE
这是我整个存储过程中使用它的方式.
PROCEDURE INSERT_INTO_RRSOC_MST
(
P_STORE_CODE IN NVARCHAR2,
P_STATE IN NVARCHAR2,
P_CITY IN NVARCHAR2,
P_SITE_STORE_FORMAT IN NVARCHAR2,
P_STORE_SITENAME IN NVARCHAR2,
P_STORE_SITENAME_LANDL_1 IN NVARCHAR2,
P_STORE_SITENAME_LANDL_2 IN NVARCHAR2,
P_STORE_ASST_MANAGER_NAME IN NVARCHAR2,
P_STORE_ASST_MANAGER_MOBNO IN NVARCHAR2,
P_STORE_MANAGER_NAME IN NVARCHAR2,
P_MANAGER_MOBNO IN NVARCHAR2,
P_EMP_NEAREST_STORE IN NVARCHAR2,
P_EMP_NEAREST_STORE_MOBNO IN NVARCHAR2,
P_SUPERVISOR_NAME IN NVARCHAR2,
P_SUPERVISOR_MOBNO IN NVARCHAR2,
P_SECURITY_SUP_NAME_STORE IN NVARCHAR2,
P_SECURITY_SUP_MOBNO_STORE IN NVARCHAR2,
P_NAME_ALIGNED_LPO IN NVARCHAR2,
P_LPO_MOBILENO IN NVARCHAR2,
P_ALPM_ALPO_NAME IN NVARCHAR2,
P_ALPM_ALPO_MOBNO IN …Run Code Online (Sandbox Code Playgroud)