我正在使用 DBeaver 作为我的数据库管理器,我正在尝试与具有多个模式的 oracleDB 建立连接,并且每个模式都有自己的用户名/密码。
我想知道是否有办法在单个数据库连接中为这些模式配置多个用户名/密码?
例如:连接到数据库示例
例子: 架构 sc1-连接到此 sc2-也连接到此 。 。 。 scn-还有这个
我正在使用 DBeaver 作为我的数据库管理器,我正在尝试与具有多个模式的 oracleDB 建立连接,并且每个模式都有自己的用户名/密码。
我想知道是否有办法在单个数据库连接中为这些模式配置多个用户名/密码?
例如:连接到数据库示例
例子: 架构 sc1-连接到此 sc2-也连接到此 。 。 。 scn-还有这个
相反,对于 LOB 列,我找不到如何在 CREATE TABLE 脚本中为 XMLTYPE 列创建的存储段指定我想要的名称。这在 Oracle 19c 上可行吗?有人最终可以发布一个示例吗?
CREATE TABLE tab (
doc XMLTYPE
)
XMLTYPE COLUMN (doc) STORAGE CLOB { name the storage segment tab#doc_lob }
我得到了一个包含以下内容的脚本:
alter table TABLE_1 add constraint pk_1 primary key(ID_1)
using index
tablespace schema1_ind
exceptions into junk;
问题是,当我运行它时,它会引发此错误:
ORA-02445: exceptions table not found
我对异常表不太熟悉,在网上能找到的信息也很少。我在 Oracle 上找到了这份文档,https://docs.oracle.com/cd/A58617_01/server.804/a58312/newch2h5.htm,其中有以下内容:
ORA-02445: 未找到异常表
原因:明确或隐含声明的异常表不存在。 操作:如果使用了正确的异常表名,则创建该表并重试启用命令。
我还发现了这个https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/EXCEPTIONS.html:
EXCEPTIONS 包含有关违反完整性约束的信息。此表由 utlexcpt.sql 脚本创建。
但是,非常奇怪的是,当我运行同样使用“垃圾”的不同脚本时,它运行时没有错误:
alter table TABLE_2 add constraint PK_2
primary key(ID_2)
using index tablespace schmea1_ind2
storage (initial 8M NEXT 2M)
exceptions into junk;
这些脚本都按照一定的顺序运行,最下面的脚本首先运行,成功运行而没有问题,然后运行一堆其他脚本,最后尝试运行最上面的脚本并失败。
问题是,我不知道如何找到这个“垃圾”异常表。我尝试单独运行第一个脚本,它成功了,但之后当我查看 DBA_OBJECTS 时,没有找到任何名为“垃圾”的东西。什么都没有。任何地方都没有创建或删除名为“垃圾”的表。
有人能解释一下为什么我会收到“未找到异常表”错误吗?如果异常表不在 dba_objects 中,那么它在哪里?为什么第一个语句失败,而第二个语句成功?
任何有关异常表的知识都会有帮助,因为我发现的文档很少。
我下载了 SQLcl,解压缩它,将 PATH 系统变量指向它的 \bin,切换到命令提示符(Windows 10),但仍然无法使用它连接到我的数据库(11g)。sql /nolog是我能做到的极限。
首先,它说:
“错误消息 = java.library.path 中没有 ocijdbc21:...”,
我搜索了一下,惊讶地发现它需要 Oracle 的“即时客户端”(Oracle 说了类似“只需解压并连接”之类的话)。我下载并安装了 IC,运行,然后又出现了另一个错误消息:
“错误消息 = libocijdbc 版本不兼容 [Jdbc:211200230906,Jdbc-OCI:2115000”
我尝试了另一个版本的 IC(版本 19),但收到“无法找到...”之类的提示,所以我切换回了“不兼容版本”(21_15)。我使用的是 SQLcl 版本 24.2.0.180.1721。
你能帮我吗?
我有一张表,我想在其中获取MODIFIED_DATE
与计数相同的记录2
例如:如果job_id
= 1234 中有2 条记录的日期为MODIFIED_DATE
=04-10-2024
则应该过滤该记录。
Name Null? Type
---------------------- -------- --------------
JOB_PROGRESS_ID NOT NULL NUMBER
JOB_ID NUMBER
STATUS_ID NUMBER
HOTO_OFFERED_DATE DATE
HOTO_ACCEPTENCE_DATE DATE
LIT_ACCEPTENCE_DATE DATE
APPROVED_BY NVARCHAR2(200)
APPROVED_DATE DATE
REJECTED_BY NVARCHAR2(200)
REJECTED_DATE DATE
APPROV_REJECT_REMARK NVARCHAR2(255)
ABD_COMPLETED_LENGTH NUMBER
NE_SPAN_LENGTH NUMBER(10,4)
CREATED_BY NVARCHAR2(200)
CREATED_DATE NOT NULL DATE
MODIFIED_BY NVARCHAR2(200)
MODIFIED_DATE DATE
我有一个脚本,它将满足特定条件的记录复制到临时表中。然后原始表被截断并将记录复制回来。
用于创建临时表的语句是;
create table ARCHIVE_TMP as select * from ORIGINAL_TABLE where TIMESTAMP_UPDATED < '2017-10-04'
而再次复制记录的声明是;
insert /*+ APPEND */ into ORIGINAL_TABLE select * from ARCHIVE_TMP
当脚本中执行第二行时,它会引发异常,ORA-01007: variable not in select list
但如果我手动运行第二条语句,它就会按预期工作。
我已经检查用户是否具有 CREATE 和 INSERT 权限,因为之前存在问题,即权限被分配给角色而不是用户。
我也尝试过在语句中指定列名select
而不是使用select *
,但这没有帮助。
以下是整个脚本;
create or replace procedure TRUNCATE_EXPIRED_ARCHIVE_DATA
(
p_retention_period in number := 84,
)
as
begin
declare
cursor table_cursor is
select owner, table_name, column_name, data_type
from all_tab_columns
where table_name like '%!_A' escape '!'
and column_name like 'TIMESTAMP!_%' escape '!'
group by owner, table_name, column_name, data_type
order by table_name, column_name;
RetentionDt date := null;
ExpiredCount number := 0;
InsertedCount number := 0;
TableExists number := 0;
ExpiredSql varchar2(500);
SelectSql varchar2(800);
SqlStmt varchar2(1300);
begin
RetentionDt := add_months(sysdate, p_retention_period * -1);
for table_rec in table_cursor loop
begin
-- Check if there are any expired records...
SelectSql := 'select count(*) from ' || table_rec.owner || '.' || table_rec.table_name;
ExpiredSql := ' where ' || table_rec.column_name || ' < ''' || RetentionDt || '''';
SqlStmt := SelectSql || ExpiredSql;
execute immediate SqlStmt into ExpiredCount;
if (ExpiredCount > 0) then
-- Drop the temporary table if it already exists...
SelectSql := 'select count(*) from tab where tname = ''ARCHIVE_TMP''';
execute immediate SelectSql into TableExists;
if (TableExists > 0) then
SelectSql := 'drop table REODT_PROD.ARCHIVE_TMP';
execute immediate SelectSql;
end if;
-- Transfer the records to be retained to the temporary table...
SelectSql := 'create table REODT_PROD.ARCHIVE_TMP as select * from ' || table_rec.owner || '.' || table_rec.table_name || ' where ' || table_rec.column_name || ' >= ''' || to_char(RetentionDt, 'YYYY-MM-DD') || '''';
execute immediate SelectSql;
InsertedCount := sql%rowcount;
commit;
if (InsertedCount > 0) then
SelectSql := 'truncate table ' || table_rec.owner || '.' || table_rec.table_name;
dbms_output.put_line('Truncate Table : ' || SelectSql);
execute immediate SelectSql;
SelectSql := 'insert /*+ APPEND */ into ' || table_rec.owner || '.' || table_rec.table_name || ' select * from REODT_PROD.ARCHIVE_TMP';
execute immediate SelectSql into InsertedCount;
commit;
end if;
end if;
end;
end loop;
end;
end;
/
SELECT
*
FROM
(
SELECT
ordr.program,
ordr.order_id,
ordr.part_no,
ordr.order_no,
ordr.actual_start_date,
ser.serial_no,
oper.asgnd_machine_id,
oper.time_stamp,
oper.updt_userid,
oper.oper_status,
oper.oper_no ,
CASE
WHEN oper.oper_no IN ('1234') THEN 'paint_bike'
END AS oper_type
FROM
sfmfg.sfwid_order_desc ordr
LEFT JOIN sfmfg.sfwid_serial_desc ser
ON ordr.order_id = ser.order_id
LEFT JOIN sfmfg.sfwid_oper_desc oper
ON ordr.order_id = oper.order_id
AND oper.step_key = -1
AND ordr.program IN ('bike')
AND oper.oper_no IN ('1234')
WHERE
ordr.actual_start_date > TO_DATE('08/01/2023', 'MM/DD/YYYY')
AND ordr.part_no LIKE '123'
AND ser.serial_no LIKE '123')
我想将这个枢轴添加到它的末尾。
PIVOT (
MAX(asgnd_machine_id) AS asgnd_machine_id,
MAX(time_stamp) AS time_stamp,
MAX(updt_userid) AS updt_userid,
MAX(oper_status) AS oper_status FOR oper_type IN ('bike_Cutting' AS bike_Cutting, 'bike_Prep' AS bike_Prep,
)
我正在尝试使数据透视表工作,但是当我为第一个 select 语句添加这样的别名时,我的第一个 select 语句出现了列定义不明确的错误
SELECT
a1.program,
a1.order_id,
a1.customer_description,
a1.stiffener_type,
a1.mold_tool_no,
a1.part_no,
a1.order_no,
a1.actual_start_date,
a1.serial_no,
a1.asgnd_machine_id,
a1.time_stamp,
a1.updt_userid,
a1.oper_status,
a1.plan_title,
a1.oper_type
它给了我无效的标识符错误
我需要在分层查询中累积数据,如下所示:
select
id,
prior id as parent_id,
count * prior count --need to be accumulated through whole hierarchy like sys_connect_by_path
from table
start with id = 1
connect by prior id = parent_id
除此之外,我只能访问前一行,因此它无法正常工作。而且我无法SELECT
对前一行使用当前子句中定义的别名:
select
id,
prior id as parent_id,
count,
(count * prior whole_count) as count_product --not allowed to do this :(
from table
start with id = 1
connect by prior id = parent_id
我缺少什么?SYS_CONNECT_BY_PATH
完全按照我的需要进行操作(除了连接而不是乘法),所以应该是可以的。我可以使用WITH
子句来执行此操作,但出于某种原因,它非常慢,例如 需要半秒,CONNECT_BY
而 需要约 20 秒WITH
。
预期输出:
ID | 父代 ID | 数数 | COUNT_PRODUCT |
---|---|---|---|
1 | 无效的 | 1 | 1 |
2 | 1 | 2 | 2 |
3 | 2 | 3 | 6 |
4 | 3 | 4 | 24 |
5 | 4 | 5 | 120 |
6 | 5 | 6 | 720 |
大家下午好,
我有一个针对 ORACLE 19 执行的 PLSQL 脚本,它显示了一个我无法理解的错误。
脚本会在重新创建索引之前删除所有现有索引。对象定义在 kind-off 列表中,以防止语句重复
我的 PLSQL 脚本是
set serveroutput on;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
DECLARE
index_not_exists EXCEPTION;
table_not_exists EXCEPTION;
PRAGMA EXCEPTION_INIT (index_not_exists, -1418);
PRAGMA EXCEPTION_INIT (table_not_exists, -942);
TYPE ind_list IS TABLE OF VARCHAR(100) NOT NULL;
ind_to_drop ind_list := ind_list('sst_ind1', 'sst_ind2');
/* first index is wrong because col0 does not exist */
ind_to_create ind_list := ind_list('create index sst_ind1 on sst_table(col0)', 'create index sst_ind2 on sst_table(col2)');
sql_to_exec varchar(200);
is_all_index_created boolean := TRUE;
BEGIN
BEGIN
EXECUTE IMMEDIATE 'drop table sst_table cascade constraints purge';
EXCEPTION
WHEN table_not_exists THEN
NULL;
END;
EXECUTE IMMEDIATE 'create table sst_table (col1 number, col2 number)';
EXECUTE IMMEDIATE 'create index sst_ind1 on sst_table (col1)';
EXECUTE IMMEDIATE 'create index sst_ind2 on sst_table (col2)';
FOR l_index IN ind_to_drop.FIRST..ind_to_drop.LAST LOOP
BEGIN
sql_to_exec := 'drop index ' || ind_to_drop(l_index);
dbms_output.put_line(sql_to_exec);
EXECUTE IMMEDIATE sql_to_exec;
EXCEPTION
WHEN index_not_exists THEN
dbms_output.put_line('no index ' || ind_to_drop(l_index));
END;
END LOOP;
FOR l_index IN ind_to_create.FIRST..ind_to_create.LAST LOOP
BEGIN
dbms_output.put_line(ind_to_create(l_index));
EXECUTE IMMEDIATE ind_to_create(l_index);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('ERROR WITH ' || ind_to_create(l_index));
is_all_index_created := FALSE;
END;
END LOOP;
IF NOT is_all_index_created THEN
RAISE_APPLICATION_ERROR(-20001, 'PROBLEM CREATING INDEX');
END IF;
END;
/
exit
当我通过 sqplus 执行脚本时,出现以下错误,我不明白
sqlplus xxxxx/yyyyy@zzzzzz @ubscls_6711.sql
SQL*Plus: Release 11.2.0.4.0 Production on Wed Sep 25 17:04:11 2024
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
drop index sst_ind1
drop index sst_ind2
create index sst_ind1 on sst_table(col0)
ERROR WITH create index sst_ind1 on sst_table(col0)
create index sst_ind2 on sst_table(col2)
DECLARE
*
ERROR at line 1:
ORA-20001: PROBLEM CREATING INDEX
ORA-06512: at line 49
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
有人能帮我解决我的问题吗?这可能很简单,但就是找不到原因。
谢谢