<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Laurent Schneider</title>
	<atom:link href="https://laurentschneider.com/feed" rel="self" type="application/rss+xml" />
	<link>https://laurentschneider.com</link>
	<description>Oracle Certified Master</description>
	<lastBuildDate>Fri, 20 Feb 2026 12:39:08 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>tnsping and instant client revisited</title>
		<link>https://laurentschneider.com/wordpress/2026/02/tnsping-and-instant-client-revisited.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Wed, 18 Feb 2026 15:45:05 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[tnsping]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3119</guid>

					<description><![CDATA[You enjoyed my old trick with https://laurentschneider.com/wordpress/2012/11/tnsping-and-instant-client.html ? you will love this one &#x2764;&#xfe0f; sqlplus -p db01 Local Net Naming configuration file: /usr/lib/oracle/23/client64/lib/network/admin/tnsnames.ora Attempting to contact: (description=(address_list=(address=(protocol=TCP)(host=srv01.example.com)(port=1521)))(connect_data=(service_name=db01.example.com))) Ok (1.143 msec) Remark: I first posted ping from within sqlplus, but -p is obviously nice. Thanks Beat Ramseier &#124; LinkedIn   via Post &#124; LinkedIn]]></description>
										<content:encoded><![CDATA[<p>You enjoyed my old trick with <a href="https://laurentschneider.com/wordpress/2012/11/tnsping-and-instant-client.html">https://laurentschneider.com/wordpress/2012/11/tnsping-and-instant-client.html</a> ? you will love this one <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2764.png" alt="❤" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<pre>sqlplus -p db01
Local Net Naming configuration file: /usr/lib/oracle/23/client64/lib/network/admin/tnsnames.ora
Attempting to contact: (description=(address_list=(address=(protocol=TCP)(host=srv01.example.com)(port=1521)))(connect_data=(service_name=db01.example.com)))
Ok (1.143 msec)</pre>
<p>Remark: I first posted ping from within sqlplus, but -p is obviously nice. Thanks <a href="https://www.linkedin.com/in/beat-ramseier-97871813a/">Beat Ramseier | LinkedIn</a>   via <a href="https://www.linkedin.com/posts/laurentschneider_no-tnsping-in-instant-client-no-problem-activity-7429914750966288384-0kQK">Post | LinkedIn</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>no salary should be 25x higher than the lowest salary</title>
		<link>https://laurentschneider.com/wordpress/2026/01/no-salary-should-be-25x-higher-than-the-lowest-salary.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Thu, 22 Jan 2026 16:03:24 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[26ai]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3116</guid>

					<description><![CDATA[This is common sense How to enforce this in a recent Oracle version? create assertion x25 check (not exists(select * from emp e where sal*25&#60;any(select sal from emp))); update emp set sal=100000 where job='PRESIDENT'; ORA-08601: SQL assertion (SCOTT.X25) violated.]]></description>
										<content:encoded><![CDATA[<p>This is common sense</p>
<p>How to enforce this in a recent Oracle version?</p>
<pre>create assertion x25 check (not exists(select * from emp e where sal*25&lt;any(select sal from emp)));
update emp set sal=100000 where job='PRESIDENT';
ORA-08601: SQL assertion (SCOTT.X25) violated.

</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Return code before grep part 3 and the pipefail hack</title>
		<link>https://laurentschneider.com/wordpress/2025/12/return-code-before-grep-part-3-and-the-pipefail-hack.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Mon, 01 Dec 2025 15:56:29 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[pipefail]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3112</guid>

					<description><![CDATA[whenever you do mycmd &#124; grep mytext the return code of command got lost, $? point to the return code of grep.  Back in time I posted https://laurentschneider.com/wordpress/2009/05/return-code-before-grep.html ( ( ( mycmd echo $? &#62;&#38;3 ) &#124;grep mytext &#62;&#38;4 ) 3&#62;&#38;1 &#124;(read x;exit $x) )4&#62;&#38;1 this did work like a charm for decades. But earlier [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>whenever you do</p>
<pre>mycmd | grep mytext</pre>
<p>the return code of command got lost, $? point to the return code of grep.  Back in time I posted https://laurentschneider.com/wordpress/2009/05/return-code-before-grep.html</p>
<pre>( 
  ( 
    (
      mycmd
      echo $? &gt;&amp;3
    ) |grep mytext &gt;&amp;4 
  ) 3&gt;&amp;1 |(read x;exit $x) 
)4&gt;&amp;1</pre>
<p>this did work like a charm for decades.</p>
<p>But earlier this year I found this sexy syntax</p>
<pre>mycmd &gt; &gt;(grep mytext)</pre>
<p>While it may abuse your memory, especially on legacy/ancient operating systems, it is more understandable. A little bit. Maybe. YMMV.</p>
<p>Last week I discovered also, while ansiblelinting my code</p>
<pre>set -o pipefail
mycmd | grep mytext</pre>
<p>It looks better but it is a disgusting hack. I tested a bit and very quickly decided to add</p>
<pre>skip_list:
- 'risky-shell-pipe'</pre>
<p>in my .ansible-lint file.</p>
<p>pipefail has an annoying handling of SIGPIPE.</p>
<pre># ( set -o pipefail; head -c 95698 /tmp/xxx | grep -q .; echo $? )
141
# ( set -o pipefail; head -c 95698 /tmp/xxx | grep -q .; echo $? )
0
# ( set -o pipefail; head -c 95698 /tmp/xxx | grep -q .; echo $? )
0
# ( set -o pipefail; head -c 95698 /tmp/xxx | grep -q .; echo $? )
0</pre>
<p>Random absolutely unusable stuff&#8230; avoid!</p>
<p>SIGPIPE is documented as :</p>
<blockquote><p>On a last note, pipes must have a reader and a writer. If a process tries to write to a pipe that has no reader, it will be sent the SIGPIPE signal from the kernel.</p></blockquote>
<p>so when <em>head</em> stops writing, grep may no longer read and the pipe may get a death signal. But it is <strong>not</strong> consistent.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>To TLS or to NNE? Postquantum hints the former</title>
		<link>https://laurentschneider.com/wordpress/2025/10/to-tls-or-to-nne-postquantum-hint-the-former.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 14:25:46 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3108</guid>

					<description><![CDATA[When encrypting Network traffic to your database server, there are two different approaches. One is to use Oracle Native Encryption by setting SQLNET.ENCRYPTION_SERVER=requested on the server sqlnet.ora and that&#8217;s about it. Very easy to setup and nothing to do on the client. Also it was a good choice for performance and security. The other option [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>When encrypting Network traffic to your database server, there are two different approaches.</p>
<p>One is to use Oracle Native Encryption by setting</p>
<p>SQLNET.ENCRYPTION_SERVER=requested</p>
<p>on the server sqlnet.ora and that&#8217;s about it. Very easy to setup and nothing to do on the client. Also it was a good choice for performance and security.</p>
<p>The other option is to setup SSL/TLS on the listener by setting</p>
<p>PROTOCOL=TCPS</p>
<p>On both the server listener.ora and the client tnsnames.ora. It is more complex and support authentication, server checks and multiple features.</p>
<p>I&#8217;ve write about this here:</p>
<blockquote class="wp-embedded-content" data-secret="DCREbdPDLx"><p><a href="https://laurentschneider.com/wordpress/2007/02/listener-with-tcps.html">listener with tcps</a></p></blockquote>
<p><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;listener with tcps&#8221; &#8212; Laurent Schneider" src="https://laurentschneider.com/wordpress/2007/02/listener-with-tcps.html/embed#?secret=aifLlHE4iT#?secret=DCREbdPDLx" data-secret="DCREbdPDLx" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<p>There has been a lot of hassle with it. Back in the time, when it was part of Oracle Networking Option or later called Advanced Security Option, it was too expensive for most customers, and pretty unused. There were some nasty security issue with REMOTE_LISTENER and RAC in 9i/10g so Oracle decided to waived that requirement around 2011 if I recall correctly.</p>
<p>But nothing was ready, not even Oracle Enterprise Manager. Old jdbc Drivers where just hanging, firewalls were confused, sqldeveloper was hanging when selecting clobs, Oracle Support wasn&#8217;t helpful, really, I did not like it.</p>
<p>In 23ai Oracle updated his documentation and now recommends TLS over NNE in Security Guide &#8211; 19. Securing data for Oracle connections.</p>
<p>Per default, SSL in Oracle 23ai now supports TLS1.3, which is Post Quantum Cryptography (PQC) ready. If you care about security, TLS adoption for your Oracle listener is recommended</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hello World java classless</title>
		<link>https://laurentschneider.com/wordpress/2025/09/hello-world-java-classless.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Thu, 18 Sep 2025 16:40:36 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3105</guid>

					<description><![CDATA[$ cat HW.java &#38;&#38; javac HW.java &#38;&#38; java HW void main() { System.out.println("Hello World"); } Hello World If you know, you know]]></description>
										<content:encoded><![CDATA[<pre>$ cat HW.java &amp;&amp; javac HW.java &amp;&amp; java HW
void main() { System.out.println("Hello World"); }
Hello World</pre>
<p>If you know, you know</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>sqlite3</title>
		<link>https://laurentschneider.com/wordpress/2025/07/sqlite3.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Wed, 23 Jul 2025 11:39:30 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[sqlite]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3102</guid>

					<description><![CDATA[I just tried sqlite. It is ultra-light and support SQL commands. Just try this $ sqlite3 test.db SQLite version 3.26.0 2018-12-01 12:34:55 Enter ".help" for usage hints. sqlite&#62; create table t(x number); sqlite&#62; insert into t values(1); sqlite&#62; select * from t; 1 sqlite&#62; $ du -h test.db 8.0K test.db I just created a database, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I just tried sqlite. It is ultra-light and support SQL commands. Just try this</p>
<pre>$ sqlite3 test.db
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.
sqlite&gt; create table t(x number);
sqlite&gt; insert into t values(1);
sqlite&gt; select * from t;
1
sqlite&gt;
$ du -h test.db
8.0K test.db</pre>
<p>I just created a database, a table and a row, issued one select. Used 8K on my home directory.</p>
<p>[satire on]What else do you expect from a database?[satire off]</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>shell [ $x ]</title>
		<link>https://laurentschneider.com/wordpress/2025/07/shell-x.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Mon, 21 Jul 2025 06:51:51 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3100</guid>

					<description><![CDATA[Long long time ago, back in SunOS ages and shell Bourne, I saw this code if [ $x ]; then ... The author told me, I was a junior java developer, it checks if x exists. I didn&#8217;t like the code. I just found out that &#8220;1 = 2&#8221; does not exist&#8230; $ x='1 = [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Long long time ago, back in SunOS ages and shell Bourne, I saw this code</p>
<pre>if [ $x ]; then ...</pre>
<p>The author told me, I was a junior java developer, it checks if x exists.</p>
<p>I didn&#8217;t like the code. I just found out that &#8220;1 = 2&#8221; does not exist&#8230;</p>
<pre>$ x='1 = 2'; if [ $x ]; then echo ok; else echo notok; fi
notok
$ x='foo'; if [ $x ]; then echo ok; else echo notok; fi
ok</pre>
<p>This is also documented in some less-ancient manpages</p>
<pre>test "$1"
test ! "$1"
could not be used reliably on some historical systems. Unexpected results would occur if such a string condition were used and $1 expanded to !, (, or a known unary primary. Better constructs are, respectively,

test -n "$1"
test -z "$1"</pre>
<p>Never trust your senior administrator, just test test test &#8230;</p>
<p>And even if you test but the code is not robust, don&#8217;t do it, it may break one day</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Changing 10g password in 19c</title>
		<link>https://laurentschneider.com/wordpress/2025/07/changing-10g-password-in-19c.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Tue, 15 Jul 2025 15:09:56 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3093</guid>

					<description><![CDATA[One user may complain about ORA-28008 when changing its old password in 19c. Many users still use the old non case sensitive passwords. Resetting User Passwords That Use the 10G Password Version is a post-upgrade task of 19c. Let&#8217;s try with the identified by values (as I wrote long time ago there alter-user-identified-by-values-in-11g ) SQL> [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>One user may complain about ORA-28008 when changing its old password in 19c.</p>
<p>Many users still use the old non case sensitive passwords. <em>Resetting User Passwords That Use the 10G Password Version</em> is a post-upgrade task of 19c.</p>
<p>Let&#8217;s try with the identified by values (as I wrote long time ago there <a href="https://laurentschneider.com/wordpress/2008/03/alter-user-identified-by-values-in-11g.html" target="_new">alter-user-identified-by-values-in-11g</a> )<br />
<code><br />
SQL> create user u identified by values '18FE58AECB6217DB' /* password U */;<br />
User created.<br />
SQL> grant create session to u;<br />
Grant succeeded.<br />
SQL> select PASSWORD_VERSIONS from dba_users where username='U';<br />
PASSWORD_VERSIONS<br />
-----------------<br />
10G<br />
SQL> conn u/U<br />
Connected.<br />
SQL> alter user u identified by ************ replace U;<br />
alter user u identified by ************ replace U<br />
*<br />
ERROR at line 1:<br />
ORA-28008: invalid old password<br />
SQL> password<br />
Changing password for U<br />
Old password: u<br />
New password: ************<br />
Retype new password: ************<br />
Password changed<br />
SQL> conn / as sysdba<br />
Connected.<br />
SQL> select PASSWORD_VERSIONS from dba_users where username='U';<br />
PASSWORD_VERSIONS<br />
-----------------<br />
10G 11G 12C<br />
</code></p>
<p>You cannot use the REPLACE clause, but the sqlplus command PASSWORD still works.</p>
<p>PS: after having earnt a total less than 100 USD of advertissement for over 1000 USD of hosting in the last 20 years, I gave up with AdSense today. Enjoy AddFree </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TIME_BUCKET group by time period</title>
		<link>https://laurentschneider.com/wordpress/2025/03/time_bucket-group-by-time-period.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Thu, 13 Mar 2025 09:22:24 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[23ai]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3089</guid>

					<description><![CDATA[We all know how to sum up by year select to_char(trunc(hiredate,'Y'),'YYYY') year, count(*) from scott.emp group by trunc(hiredate,'Y') order by trunc(hiredate,'Y') YEAR COUNT(*) ---- -------- 1980 1 1981 10 1982 1 1987 2 This is quite easy. Same for day (DD), century (CC), quartal (Q), hour (HH24), month (MM) But how do you group by, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>We all know how to sum up by year</p>
<div>
<div>
<pre>select
  to_char(trunc(hiredate,'Y'),'YYYY') year,
  count(*)
from
  scott.emp
group by
  trunc(hiredate,'Y')
order by 
  trunc(hiredate,'Y')

YEAR COUNT(*)
---- --------
1980        1
1981       10
1982        1
1987        2</pre>
</div>
<div>This is quite easy. Same for day (DD), century (CC), quartal (Q), hour (HH24), month (MM)</div>
<div>But how do you group by, let&#8217;s say, half-year? or fiscal year, half day, 8-hours period, etc&#8230; ?</div>
<div>One way is to convert to number&#8230;</div>
<div>
<pre>select 
  replace(
    replace(
      to_char(
        trunc(
          months_between(
            hiredate, 
            date '1900-01-01'
          )/6
        )/2,
        '00.0'
      ),
    '.0','H1'
  ),'.5','H2') HY, 
  COUNT(*) 
from 
  scott.emp 
group by 
  trunc(months_between(hiredate, date '1900-01-01')/6) 
order by 
  trunc(months_between(hiredate, date '1900-01-01')/6);

HY         COUNT(*)
------- -----------
80H2              1
81H1              5
81H2              5
82H1              1
87H1              2</pre>
</div>
</div>
<p>We could also add some offset to start in March and choose 180 days instead of 6 months etc&#8230; But it gets really hard to read (and write)</p>
<p>In Oracle 23.7, I could not test it yet, simply write &#8230;</p>
<pre>select
  time_bucket(hiredate, interval '6' month, date '1900-01-01'),
  count(*)
from
  scott.emp
group by
  time_bucket(hiredate, interval '6' month, date '1900-01-01')</pre>
<p>It is much nicer <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>sqlnet.ora and ldap.ora parameters in jdbc thin url</title>
		<link>https://laurentschneider.com/wordpress/2025/03/sqlnet-ora-and-ldap-ora-parameters-in-jdbc-thin-url.html</link>
		
		<dc:creator><![CDATA[Laurent Schneider]]></dc:creator>
		<pubDate>Fri, 07 Mar 2025 08:27:23 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[ldap]]></category>
		<guid isPermaLink="false">https://laurentschneider.com/?p=3086</guid>

					<description><![CDATA[Using the latest instant client, the Easy Connect Plus improvement let you parametrise your jdbc url more intensively &#160; jdbc:oracle:thin:@ldaps://ldap.example.com/db01?WALLET_LOCATION=/db00/mywallet&#38;AUTHENTICATE_BIND=true&#38;AUTHENTICATE_BIND_METHOD=none&#38;DIRECTORY_SERVER_TYPE=OID &#160; EasyConnect Plus appeared in 19c, but was further improved in 21c and 23ai. See more JDBC Developer&#8217;s Guide https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/data-sources-and-URLs.html#GUID-44572C63-10D2-478A-BB2E-ACF6674C59CC]]></description>
										<content:encoded><![CDATA[<p>Using the latest instant client, the Easy Connect Plus improvement let you parametrise your jdbc url more intensively</p>
<p>&nbsp;</p>
<pre>jdbc:oracle:thin:@ldaps://ldap.example.com/db01?WALLET_LOCATION=/db00/mywallet&amp;AUTHENTICATE_BIND=true&amp;AUTHENTICATE_BIND_METHOD=none&amp;DIRECTORY_SERVER_TYPE=OID</pre>
<p>&nbsp;</p>
<p>EasyConnect Plus appeared in 19c, but was further improved in 21c and 23ai.</p>
<p>See more</p>
<p>JDBC Developer&#8217;s Guide</p>
<p><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/data-sources-and-URLs.html#GUID-44572C63-10D2-478A-BB2E-ACF6674C59CC">https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/data-sources-and-URLs.html#GUID-44572C63-10D2-478A-BB2E-ACF6674C59CC</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
