我知道这听起来很奇怪,但我需要执行一些PL/SQL,其中包的所有者与Oracle保留字冲突,IF.
基本上,对象的所有者是IF.当我使用SQL Developer执行该过程时,生成的脚本会抛出错误,因为它尝试将游标变量声明为:
variable_name IF.MYCUSTOM_TYPE
Run Code Online (Sandbox Code Playgroud)
目前我无法控制架构,所以我无法改变任何东西.
这是我的一些数据的示例.我试图删除所有额外的数据,其中QueryID和RoyID与表中的其他条目相同,但是,我想保留至少一条记录.我不确定我是否能够在ID列上使用min或max函数,因为某些记录具有DEMO_12345等ID.
ID QUERY_ID ROYALTY_ID
RTSQR1652 SQ1421 ROY25644005
RTSQR1653 SQ1421 ROY25636406
RTSQR1654 SQ1421 ROY25636557
RTSQR1655 SQ1421 ROY25636558
RTSQR1656 SQ1421 ROY25636559
RTSQR1657 SQ1421 ROY25636560
Run Code Online (Sandbox Code Playgroud)
我在考虑使用ROWID而不是ID.以下查询是否有效?
DELETE FROM RT_SOURCE_QUERY_ROYALTIES WHERE ROWID NOT IN (
SELECT MAX(ROWID) FROM RT_SOURCE_QUERY_ROYALTIES GROUP BY ROYALTY_ID, QUERY_ID);
Run Code Online (Sandbox Code Playgroud) 我想在Oracle 10g互联网环境中做一个简单的PL/SQL程序.该计划是:
DECLARE
stud_rec students%ROWTYPE;
last_name VARCHAR2:='Clinton';
BEGIN
SELECT * INTO stud_rec FROM students WHERE student_id=100;
END;
Run Code Online (Sandbox Code Playgroud)
我有一张名为学生的桌子,里面有数据.问题是,当我想在SQL命令窗口中运行它时,我收到了以下消息:
ORA-06550: line 3, column 11:
PLS-00215: String length constraints must be in range (1 .. 32767)
Run Code Online (Sandbox Code Playgroud)
我检查了语法,但找不到错误.有帮助吗?提前致谢
我试图使用sqlplus和Oracle假脱机功能导出一些数据.问题是我定义导出的SQL输入文件不允许我参数化我从中导出数据的表名 - 它想要一个文字:(
在shell脚本中调用sqlplus:
sqlplus $USER/$PASSWD@$ORADB<<!
@export.sql $OUT_FILE $SOME_VAR $ENV
exit
!
Run Code Online (Sandbox Code Playgroud)
export.sql:
set heading off
set head off
set term off
set tab off
set embedded on
set feedback off
set pagesize 0
set linesize 800
set trimspool on
set verify off
spool &1
SELECT '&2|' || some_col
FROM &3_TABLE
/
spool off
Run Code Online (Sandbox Code Playgroud)
当$ ENV设置为'dev'时,我明白了
Enter value for 3_TABLE
Run Code Online (Sandbox Code Playgroud)
而我希望它使用dev_TABLE.当我取消参数化sql文件中的表名时,输出运行正常.另请注意,有一个param&2,它是来自shell的$ SOME_VAR,它显示得很好.唯一的问题是在FROM语句中.
有没有办法告诉sql输入文件在运行SQL之前替换参数化表名?
谢谢
我需要用户无权访问另一个方案,但存储过程可以访问不同的模式.
我需要为经理ID取决于传递参数的所有员工返回字符串格式的员工姓名.当我编译该函数时,我得到一个错误.这是功能代码:
create or replace function Employee(v_manid IN employees.manager_id%type)
return varchar2
AS
cursor cur_emp is select last_name from employees where manager_id = v_manid;
v_names varchar2(10);
begin
for emp_rec in cur_emp
loop
v_name = v_name || emp_rec.last_name ||', ';
end loop;
return v_name
end;
/
Run Code Online (Sandbox Code Playgroud)
错误是:
错误(8,8):PLS-00103:遇到以下其中一项时遇到符号"=":: =.(@%;错误(8,44):PLS-00103:遇到以下其中一项时遇到符号";":),*& - +/at mod remaining rem和or ||
任何人都可以帮我这个吗?
我正在尝试创建一个查询,列出Oracle 10g数据库中每个用户名的每台计算机的活动,非活动和总连接数.
我有以下查询:
SELECT count(1) AS con_count, machine, username
FROM v$session
WHERE type <> 'BACKGROUND'
GROUP BY username, machine
ORDER BY con_count DESC;
Run Code Online (Sandbox Code Playgroud)
这将列出每个用户每个计算机的总连接数的计数,但是在调整它以将活动,非活动和总连接计数作为一个一体化查询时很难.
所以结果应该是这样的:
ACTIVE INACTIVE TOTAL MACHINE USERNAME
Run Code Online (Sandbox Code Playgroud)
我可以让查询执行前三列之一,但不能同时执行所有三列.
任何帮助将不胜感激,因为我的SQL非常非常生疏.
我们正在将数据库从Oracle迁移到SQL Server.我的查询广泛使用了Oracle的nvl函数.在SQL Server中,要使用的函数是isnull().如果可能的话,我想通过将它们更改为使用isnull()来开始准备我的查询,同时仍然在Oracle上.我的想法是在我的模式中创建一个包装函数isnull()并更改我的查询以使用该函数.这样,当我们切换数据库平台时,我的查询已经在使用新功能.
有没有办法在Oracle中创建一个名为isnull()的包装器函数,它接受并返回任何数据类型?或者我只需要有多个isnull()声明,为所有预期的数据类型重载?
我目前在Codeigniter上使用oci8驱动程序.在更新一个超过4000个字符的字段时,我收到了一个错误:
ORA-01704: string literal too long
Run Code Online (Sandbox Code Playgroud)
所以,通过几个博客,我得到了这个:
declare
vClobVal varchar2(32767) := 'long text'
begin
update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY=vClobVal
where FKOL_OFFICEWISE_LETTER_ID=240;
end;
Run Code Online (Sandbox Code Playgroud)
在Toad被解雇时,这对我有用.现在,我创建了一个存储过程并编译为:
CREATE OR REPLACE PROCEDURE FMIS3.UPDATE_LETTER_BODY ( body_text IN FMS_K_OFFICEWISE_LETTER.FKOL_LETTER_BODY%type,condition_id in FMS_K_OFFICEWISE_LETTER.FKOL_OFFICEWISE_LETTER_ID%type)IS
begin
update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY=body_text
end;
Run Code Online (Sandbox Code Playgroud)
这对于超过4000个字符再次不起作用.我无法定义varchar2的大小,因为它给了我错误.有什么建议 ?
即使尝试通过绑定参数使用PDO,只有当字符串的大小小于4000个字符时才有效:(
$conn = new PDO("oci:dbname=".$this->db->hostname,$this->db->username,$this->db->password);
$params = array(
':body_text' => "Long String"
);
$sth = $conn->prepare("update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY = :body_text
where FKOL_OFFICEWISE_LETTER_ID=241");
$sth->execute($params) or die('error occured');
Run Code Online (Sandbox Code Playgroud) 我有一个独特的场景,我需要将多个列值放入多个变量中.我面临的问题是,虽然存在一个列值,但其他列不需要存在,因此我最终得到DATA NOT FOUND异常,而我想要抑制它并将空值放入剩余的变量中.
select nvl(A,''), nvl(B,''), nvl(C,'')
into A1, B1, C1
from SAMPLE_TABLE
where name ='W6';
Run Code Online (Sandbox Code Playgroud)
表中的A值可以是"hello",B的值为null,表中的C值为null.
当语句在存储过程的主体内执行时,我不希望DATA NOT FOUND Exception,而是我希望A1的值为'hello',B1为'',C1为''.我将动态地运行它并且where条件不断变化,因此我也不想打开那些多个游标.任何人都可以让我知道我怎么能做到这一点?