我最好找一个SQL查询来完成这个,但其他选项也可能有用.
我在C#中创建一个应用程序,它使用Oracle.DataAccess.Client(11g)在存储过程的Oracle数据库上执行某些操作.我知道有一个枚举(OracleDbType)包含Oracle数据类型,但我不确定哪一个用于某些类型.
OracleDbType枚举中每个枚举类型的等效Oracle PL/SQL数据类型是 什么?
OracleDbType中有三种类型的整数(Int16,Int32,Int64)...如何知道使用哪一个或者它们都
假设有效?
我正在尝试在包中创建一个返回表的函数.我希望在包中调用一次函数,但能够多次重复使用它的数据.虽然我知道我在Oracle中创建临时表,但我希望保持干燥.
到目前为止,这就是我所拥有的:
标题:
CREATE OR REPLACE PACKAGE TEST AS
TYPE MEASURE_RECORD IS RECORD (
L4_ID VARCHAR2(50),
L6_ID VARCHAR2(50),
L8_ID VARCHAR2(50),
YEAR NUMBER,
PERIOD NUMBER,
VALUE NUMBER
);
TYPE MEASURE_TABLE IS TABLE OF MEASURE_RECORD;
FUNCTION GET_UPS(
TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
STARTING_DATE_IN DATE,
ENDING_DATE_IN DATE
) RETURN MEASURE_TABLE;
END TEST;
Run Code Online (Sandbox Code Playgroud)
身体:
CREATE OR REPLACE PACKAGE BODY TEST AS
FUNCTION GET_UPS (
TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
STARTING_DATE_IN DATE,
ENDING_DATE_IN DATE
) RETURN MEASURE_TABLE IS
T MEASURE_TABLE;
BEGIN
SELECT ...
INTO T …Run Code Online (Sandbox Code Playgroud) 在下面的例子中,我为每个子类型编写了一个to_str()函数和一个set()过程pls_integer.除类型外,功能和程序几乎相同.
如何在不放弃子类型提供的约束的情况下消除编写另一个to_str()和set()新子类型的需要?
回落varchar2喜欢
procedure set(list in varchar2, prefix in varchar2)
Run Code Online (Sandbox Code Playgroud)
然后将其称为
set(to_str(list), 'foos:')
Run Code Online (Sandbox Code Playgroud)
这听起来不太好,我仍然需要to_str()为每个子类型提供.
我对所有不同的提案都持开放态度,因为我是甲骨文的新手,几乎每天都有新的Oracle功能让我感到惊讶.
我正在运行11.2.0.1.0.
create table so1table (
id number,
data varchar(20)
);
create or replace package so1 as
subtype foo_t is pls_integer range 0 .. 4 not null;
type foolist is table of foo_t;
procedure set(id_ in number, list in foolist default foolist(1));
subtype bar_t is pls_integer range 5 .. 10 not null; …Run Code Online (Sandbox Code Playgroud) 我有这样一张桌子:
Id | GroupId | Category
------------------------
1 | 101 | A
2 | 101 | B
3 | 101 | C
4 | 103 | B
5 | 103 | D
6 | 103 | A
........................
Run Code Online (Sandbox Code Playgroud)
我需要GroupId随机选择其中一个.为此,我使用了以下PL/SQL代码块:
declare v_group_count number;
v_group_id number;
begin
select count(distinct GroupId) into v_group_count from MyTable;
SELECT GroupId into v_group_id FROM
(
SELECT GroupId, ROWNUM RN FROM
(SELECT DISTINCT GroupId FROM MyTable)
)
WHERE RN=Round(dbms_random.value(1, v_group_count));
end;
Run Code Online (Sandbox Code Playgroud)
因为我舍入了随机值,所以它将是一个整数值,WHERE RN=Round(dbms_random.value(1, …
如何让PL/SQL程序中途结束?如果发生异常,我无法找到任何方式优雅地结束程序 - 如果我处理它,它会循环回代码.
基本上我想做的是强迫应用程序不要在某些条件下运行.所以,我想在程序的顶部添加这样的东西:
BEGIN
IF [condition]
EXIT
END IF
[the rest of the program]
END
Run Code Online (Sandbox Code Playgroud)
建议的方法是抛出一个异常,但是块可能是一个内部块 - 所以块之外的程序只是继续.
*EDIT6:*这最终为我工作(从接受的答案):
var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc)
print :tran_cnt
print :msg_cnt
print :rc
Run Code Online (Sandbox Code Playgroud)
SQL Developer让这个超级难/不可能?我不在乎该实用程序是否基于命令行; 我只是希望能够快速运行并查看它.如果它也能很好地捕获错误,那就太好了.能够逐步(交互式)登录,以及一次性指定所有内容(类似于典型的基于ftp/sftp cmd的客户端的工作方式)将会很棒.
我的平台是Windows Server 2008 + Cygwin.
编辑:也许你会知道如何使用Python编写脚本?
编辑2:在MSFT SQL服务器中,我只需输入:
get_user 1;
Run Code Online (Sandbox Code Playgroud)
然后突出显示它并点击F5,我得到:
login name
NULL Somename
Run Code Online (Sandbox Code Playgroud)
打印到输出窗口.Oracle SQL开发人员根本没有帮助.我不知道如何传入1,我不知道如何查看返回的实际行/记录.
编辑3:当我输入var rc refcursor;并选择并运行它时,我收到此错误(GUI):
An error was encountered performing the requested …Run Code Online (Sandbox Code Playgroud) oracle plsql stored-procedures sys-refcursor oracle-sqldeveloper
有谁知道PL/SQL过程(在这种情况下是一个错误记录过程)是否可以获得调用它的函数/过程的名称?
显然,我可以将名称作为参数传递,但是进行系统调用或获取信息是很好的 - 如果没有从过程/函数调用它,它可能只返回null或其他东西.
如果没有方法可以做到这一点很好 - 只要有可能就好奇(搜索没有产生任何结果).
我正在使用JDBC来执行如下所示的Oracle语句:
"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert
Run Code Online (Sandbox Code Playgroud)
我发现了几种在Java中调用上述语句的方法,主要是:
使用OraclePreparedStatement:
ps = (OraclePreparedStatement)conn.prepareStatement(sql);
ps.setString(1, "myvalue");
ps.registerReturnParameter(2, Types.VARCHAR);
ps.execute();
rs = ps.getReturnResultSet();
rs.next();
System.out.print(rs.getString(1));
Run Code Online (Sandbox Code Playgroud)使用CallableStatement:
cs = conn.prepareCall(sql);
cs.setString(1, "myvalue");
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
System.out.print(cs.getString(1));
Run Code Online (Sandbox Code Playgroud)谢谢你,AG.
当我尝试在TOAD中插入一个带有'&'的值时,我得到一个替换变量的提示.
所以,当我尝试:
insert into x values('hello & world');
Run Code Online (Sandbox Code Playgroud)
它会提示替换变量'world'.
我尝试右键单击编辑器并禁用替换变量的提示,但这似乎仅适用于Execute Statement(F9)它不适用于Execute as script(F5).
我也知道使用chr(38)像:
insert into x values('hello '||chr(38)||'world');
Run Code Online (Sandbox Code Playgroud)
但我不想要这个.还有其他东西可以帮助我运行脚本吗?