显然,如果我使用 JDBC/ODBC,我可以使用绑定变量和预准备语句来防止 SQL 注入。但是,当数据传递到最终调用 Oracle SQLPlus 的批处理过程时,是否有办法防止 SQL 注入?例如:
查询.sql:
select '&1' from dual;
exit;
Run Code Online (Sandbox Code Playgroud)
如果我这样从 SQLPlus 调用这个脚本:
$ sqlplus SCOTT/TIGER @query.sql "x','y"
Run Code Online (Sandbox Code Playgroud)
我将得到以下输出:
old 1: select '&1' from dual
new 1: select 'x','y' from dual
' '
- -
x y
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,SQLPlus 命令行参数使用简单的宏替换。我缺少替代方法吗?否则,我如何防止它被利用?
我在 SQL*Plus 中给出一个 select 语句。它正在检索数据,但每次在一定数量的行之后都会显示列名称。我希望列名只显示一次。
例如:
select emp_name from employee.
Run Code Online (Sandbox Code Playgroud)
目前得到输出:
emp_name
========
raman
sunil
rajesh
dilip
emp_name
========
rahul
pramod
ankita
Run Code Online (Sandbox Code Playgroud)
我想要这样的输出:
emp_name
========
pankaj
ruchi
amar
rakesh
dilip
raju
rahul
Run Code Online (Sandbox Code Playgroud)
全部在单列标题下。我怎样才能做到这一点?
我有一些代码需要帮助调试,但我觉得如果我能让其中一个运行,我就能得到其余的(哦,我多么希望)。
create or replace
trigger minimumwage
before insert or update on Employee
for each row
begin
if :new.Wage < 7.25
then raise_application_error('-20000,Pay is below Texas minimum wage!');
end if;
end;
/
Run Code Online (Sandbox Code Playgroud)
如果有帮助,我正在尝试在通过 sqlplus 在我学校服务器上运行的表上执行此操作。
我想在cron中运行一个脚本,其中包含一些sqlplus命令.
问题是,当在cron中执行时,sqlplus命令由于某种原因不会被执行.如果我自己执行它,脚本运行正常.
我已经检查了一些论坛,甚至是stackoverflow.com上的主题,并找到了一些关于正确设置环境变量的技巧.但即使仔细检查后,脚本也无效.
这是我的脚本:
echo $ORACLE_HOME|grep "oracle" > /dev/null
if [ $? = 1 ] ; then
echo "Setting environment variable"
# Setting oracle environmet
. /usr/oracle/product/10.2.0/.profile
NLS_LANG='AMERICAN_GERMANY.WE8ISO8859P1'
fi
/usr/oracle/product/10.2.0/bin/sqlplus username/password @basics.sql > export.file
Run Code Online (Sandbox Code Playgroud)
basics.sql包含:
set pagesize 0
set feedback off
set heading off
set linesize 400
set NULL nll
SELECT SOME_FIELDS FROM TABLE ORDER BY FIELD;
EXIT;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是我的oracle查询:
SELECT DISTINCT Student.student_id, student_name, SUM(credit)
FROM Student, Class, Enrolls
WHERE Student.student_id = Enrolls.student_id
AND Class.schedule_num = Enrolls.schedule_num
AND Class.semester = Enrolls.semester
AND grade != 'F'
AND grade IS NOT null
ORDER BY student_id ASC;
Run Code Online (Sandbox Code Playgroud)
查询工作正常,直到我添加SUM(credit).之后我得到:
ORA-00937: not a single-group group function
Run Code Online (Sandbox Code Playgroud)
请帮忙,谢谢.
我在 shell 脚本中使用 sqlplus 并且它可以工作(sqlplus 没有静默模式)但我可以在终端中看到输出。我尝试使用不同的组合在静音模式下运行它,但它没有用 -
sqlplus -s "$DBUSER/$DBPWD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DBHOST)(Port=$DBPORT))(CONNECT_DATA=(SID=$DBSID)))" @$SCRHOME/getCsv$sqlFile.sql
Run Code Online (Sandbox Code Playgroud)
<顺便说一句 -s 是黄色而不是黑色,就像 shell 脚本中的 echo 命令>
它有效,但我可以在控制台上看到输出。我也试过:
sqlplus \-s "....
sqlplus \-s \ "...
sqplus -S
sqlplus -s \ << EOF "...
Run Code Online (Sandbox Code Playgroud)
我尝试删除双引号,但在这种情况下,即使 sqlplus 命令也不起作用。我在 shell 脚本中使用这个命令。
SQL Plus中有没有办法知道所有SET命令的状态?
例如,WRAP是否设置为OFF或ON等.
我在网上搜索过,找不到任何东西.我也认为它可能类似于CMD中的SET,但是如果你试试这个:
SET
Run Code Online (Sandbox Code Playgroud)
你得到:
SP2-0545:SET命令需要参数.
如何获得所有当前SET的值?
如果我不清楚,我想知道是否有类似这样的命令:
SHOW SETS
Run Code Online (Sandbox Code Playgroud)
这将返回类似的东西
WRAP ON
LONG 3000
LINESIZE 344
VERIFY OFF
etc..
Run Code Online (Sandbox Code Playgroud) 我正在使用Oracle 12c,并且在删除表“ CONTINENT”时出现错误(如果它不存在的话)不会引起我的兴趣。
我做了这个
set echo on
set serveroutput on
alter session set current_schema=WORK_ODI;
set verify off
set pause off
--
WHENEVER SQLERROR CONTINUE
drop table CONTINENT;
COMMIT;
EXIT;
Run Code Online (Sandbox Code Playgroud)
但是当表不存在时它不会跳过该错误,请问该如何解决
我是 PL SQL 的初学者。
我正在尝试使用 PL SQL ACCEPT 语句接受变量中的字符串。这是代码 -
ACCEPT lastname CHAR FORMAT 'A20' PROMPT 'Enter employee lastname: '
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE(lastname);
END;
Run Code Online (Sandbox Code Playgroud)
我在 SQL Developer 中没有收到任何错误或输出。我无法理解我在这里错过了什么。
基本上,我想要做的是从用户那里读取一个值(字符串)并在我对表的查询中使用它。
我正在尝试使用 sqlplus 运行脚本。我的脚本是一个简单的删除语句。我通过将以下内容放入我的 ksh 终端来执行它:
sqlplus username/'password' @../sql/delete_societes.sql
Run Code Online (Sandbox Code Playgroud)
../sql/delete_societes.sql 是
DELETE FROM f2020.SOCIETES;
/
Run Code Online (Sandbox Code Playgroud)
出于某种原因,它运行了两次,导致输出“0 行被删除”被打印两次并在我尝试执行插入而不是删除时导致错误。